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