Hello,各位小伙伴大家好,我是小堆疊君,上一期我們講到了關于函式的有參、無參、匿名函式,本期我們分享一下關于go語言函式型別、匿名函式和閉包的概念和實戰,閑話不多說,立馬開始分享,
在Go語言中,函式也是一種資料型別,我們可以通過type來定義它,它的型別就是所有擁有相同的引數,相同的回傳值的一種型別,

//IT干貨堆疊,每天分享IT干貨
// 定義一個函式型別 --求和
type FunctionType func(a, b int) (num int) //宣告一個函式型別, func后面沒有函式名
//在函式中傳參中我們有一個引數為函式型別的
func Calc(a, b int, functionType FunctionType) (num int) {
return functionType(a, b)
}
func Add(a, b int) (sum int) {
sum = a + b
return
}
func Abs(a, b int) int {
return a - b
}
func main() {
num := Calc(1, 2, Add)
fmt.Println("求和計算結果--》", num)
calc := Calc(3, 2, Abs)
fmt.Println("求差計算結果", calc)
functionType := Add
i := Calc(4, 5, functionType)
fmt.Println(i)
}
所以在Go語言中,我們不僅僅使用的是變數,常量,物件等,也是可以使用函式型別進行傳參,這個傳參是多種多樣的,
函式之匿名函式和閉包
匿名函式就是一種不需要定義函式名的函式,在Go語言里,所有的匿名函式(Go語言規范中稱之為函式字面量)都是閉包,
匿名函式是指不需要定義函式名的一種函式實作方式,它并不是一個新概念,最早可以回溯到1958年的Lisp語言,其中我們寫一個簡單的例子

只是將一個匿名函式賦值給一個變數f ,然后進行執行,當然最后的結果就是4啦~
當然關于匿名函式的定義是可以分很多種的,

溫馨提示,千萬別忘記后面的括號,此處是直接呼叫匿名函式并進行傳參,
所謂閉包就是一個函式“捕獲”了和它在同一作用域的其它常量和變數,這就意味著當閉包被呼叫的時候,不管在程式什么地方呼叫,閉包能夠使用這些常量或者變數,
它不關心這些捕獲了的變數和常量是否已經超出了作用域,所以只有閉包還在使用它,這些變數就還會存在,

如圖所示,我們可以看到在外部定義了i為1 ,str是“it小堆疊君”,但是在匿名函式內部我們將變數重新賦值后,內部和外部都成為了100和go了,
所以由此可知函式閉包是以參考的方式捕獲外部變數,可能這樣說還是太深奧了,那么小堆疊君這邊也是通過幾個示例給大家解釋一下吧,

我們首先定義了個普通的函式,并沒有初始化開始的值,只有當函式被呼叫的時候才進行值的初始化,分配空間為0,當函式呼叫完畢后函式值就會被釋放,所以我們得到的值就一直是2,
但是如果我們將函式型別設定成回傳一個匿名函式,業務邏輯不改變的前提下,如圖所示:

如圖所示,我們將add2設定成回傳一個匿名函式,在匿名函式中有相同的業務邏輯就是a進行自加一后,然后進行相加,
我們通過f來進行呼叫回傳函式,在進行呼叫閉包函式,之前有句話說的“它不關心這些捕獲了的變數和常量是否已經超出了作用域,所以只有閉包還在使用它,這些變數就還會存在,”
只要函式還在呼叫(f()),那么它就一直存在,然而普通函式呼叫后就直接釋放掉了,對add2的一次呼叫會生成一個區域變數a并回傳一個匿名函式,
每次呼叫時匿名函式時,該函式都會先使a的值加1,再回傳a的和,第二次呼叫add2時,會生成第二個a變數,并回傳一個新的匿名函式,新匿名函式操作的是第二個a變數,
通過這個例子,我們看到變數的生命周期不由它的作用域決定:add2回傳后,變數a仍然隱式的存在于f中,
所以各位小伙伴也要盡量掌握關于匿名函式和閉包的概念哦,今天的分享就到這里啦,如果你喜歡我的分享,麻煩你點擊收藏、分享或再看,讓更多的小伙伴加入我們的學習陣營中來,
這里每天會分享包含java,go,Python,大資料,人工智能的相關干貨,我們一起提高,一起進步,我是小堆疊君,我們明天再見,拜了個拜,

本文由博客一文多發平臺 OpenWrite 發布!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/69262.html
標籤:Go
下一篇:三層架構開發問題 d7 +sql2008 +TSocketConnection+ScktSrvr.exe 客戶端斷網后怎樣才能重新連接
