Hello,各位小夥伴你們好,我是小棧君。上一期咱們講到了關於函數的有參、無參、匿名函數,本期咱們分享一下關於go語言函數類型、匿名函數和閉包的概念和實戰。閒話很少說,立馬開始分享。java
在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啦~code
固然關於匿名函數的定義是能夠分不少種的。對象
舒適提示,千萬別忘記後面的括號。此處是直接調用匿名函數並進行傳參。blog
所謂閉包就是一個函數「捕獲」了和它在同一做用域的其它常量和變量。這就意味着當閉包被調用的時候,無論在程序什麼地方調用,閉包可以使用這些常量或者變量。生命週期
它不關心這些捕獲了的變量和常量是否已經超出了做用域,因此只有閉包還在使用它,這些變量就還會存在。
如圖所示,咱們能夠看到在外部定義了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 發佈!