Golang回調(diào)函數(shù)與閉包和接口函數(shù)的定義及使用介紹
回調(diào)函數(shù)
定義
回調(diào)函數(shù)是把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個(gè)函數(shù),當(dāng)這個(gè)指針被用來調(diào)用其所指向的函數(shù)時(shí),就說這是回調(diào)函數(shù)。
eg:js接口回調(diào)函數(shù),gin handler
意義
回調(diào)函數(shù)是用戶實(shí)現(xiàn)異步的一種方式:把處理函數(shù)注冊(cè)為一個(gè)路由的回調(diào)函數(shù),當(dāng)有請(qǐng)求后自動(dòng)調(diào)用回調(diào)函數(shù);這樣主程序的執(zhí)行,就不受到請(qǐng)求的影響,實(shí)現(xiàn)了異步。當(dāng)然這里的異步機(jī)制由epoll實(shí)現(xiàn),不能算嚴(yán)格意義上的異步。
閉包
定義
閉包指的是一個(gè)函數(shù)和與其相關(guān)的引用環(huán)境組合而成的實(shí)體;簡(jiǎn)單來說,閉包=函數(shù)+引用環(huán)境。
閉包是指有權(quán)訪問另一個(gè)函數(shù)作用域中的變量的函數(shù);創(chuàng)建閉包的常見方式就是在一個(gè)函數(shù)內(nèi)部創(chuàng)建另一個(gè)函數(shù), 內(nèi)函數(shù)可以訪問外函數(shù)的變量。
eg:
func adder() func(x int)int{ i:=10 //adder()里的局部變量i可以被fn和fn1訪問到,并且每一個(gè)閉包實(shí)例里i都有自己的值 return func()int{ return i+x } } func main() { fn := adder() fmt.Println(fn(10)) //20 fmt.Println(fn(10)) //30 fn1 := adder() fmt.Println(fn1(10)) //20 fmt.Println(fn1(10)) //30 }
意義
全局變量:
1.常駐內(nèi)存
2. 污染全局
局部變量:
1.不常駐內(nèi)存
2.不污染全局
而Go語言的閉包:
1.可以讓變量常駐內(nèi)存
2.可以讓變量不污染全局
所以閉包主要是為了避免全局變量的濫用。
閉包里作用域返回的局部變量不會(huì)被立刻銷毀回收,但過度使用閉包可能會(huì)占用更多內(nèi)存,導(dǎo)致性能下降。
接口函數(shù)
定義
函數(shù)類型實(shí)現(xiàn)某一個(gè)接口,稱之為接口型函數(shù),接口型函數(shù)只能應(yīng)用于接口內(nèi)部只定義了一個(gè)方法的情況。
意義
方便使用者在調(diào)用時(shí)既能夠傳入函數(shù)作為參數(shù),也能夠傳入實(shí)現(xiàn)了該接口的結(jié)構(gòu)體作為參數(shù)。
當(dāng)接口作為參數(shù)時(shí):我們可以選擇兩種接口實(shí)現(xiàn)方式,接口函數(shù)實(shí)現(xiàn)接口和結(jié)構(gòu)體實(shí)現(xiàn)接口。
當(dāng)邏輯較為復(fù)雜的場(chǎng)景,如果對(duì)數(shù)據(jù)庫的操作需要很多信息,地址、用戶名、密碼,還有很多中間狀態(tài)需要保持,比如超時(shí)、重連、加鎖等等。這種情況下,更適合封裝為一個(gè)結(jié)構(gòu)體作為參數(shù)。
當(dāng)邏輯較為簡(jiǎn)單時(shí),可以直接傳入接口函數(shù)。
func test(key string) ([]byte, error) { return []byte(key), nil } func main() { GetFromSource(GetterFunc(test), "hello") } //將 test 強(qiáng)制類型轉(zhuǎn)換為 GetterFunc,GetterFunc 實(shí)現(xiàn)了接口 Getter,是一個(gè)合法參數(shù)。這種方式適用于邏輯較為簡(jiǎn)單的場(chǎng)景。
這樣既能夠?qū)⑵胀ǖ暮瘮?shù)類型(需類型轉(zhuǎn)換)作為參數(shù),也可以將結(jié)構(gòu)體作為參數(shù),使用更為靈活,可讀性也更好,這就是接口型函數(shù)的價(jià)值。
到此這篇關(guān)于Golang回調(diào)函數(shù)與閉包和接口函數(shù)的定義及使用介紹的文章就介紹到這了,更多相關(guān)Golang回調(diào)函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語言遍歷map實(shí)現(xiàn)(訪問map中的每一個(gè)鍵值對(duì))
這篇文章主要介紹了Go語言遍歷map實(shí)現(xiàn)(訪問map中的每一個(gè)鍵值對(duì)),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01golang實(shí)現(xiàn)http server提供文件下載功能
這篇文章主要介紹了golang實(shí)現(xiàn)http server提供文件下載功能,本文給大家簡(jiǎn)單介紹了Golang的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02Golang中重復(fù)錯(cuò)誤處理的優(yōu)化方法
這篇文章主要給大家介紹了關(guān)于Golang中重復(fù)錯(cuò)誤處理優(yōu)化的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Golang具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04Go語言中slice作為參數(shù)傳遞時(shí)遇到的一些“坑”
這篇文章主要給大家介紹了關(guān)于Go語言中slice作為參數(shù)傳遞時(shí)遇到的一些“坑”,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-03-03