1. 程式人生 > 程式設計 >Go語言系列教程(十二)之函式完結篇

Go語言系列教程(十二)之函式完結篇

Hello,各位小夥伴大家好,我是小棧君。上一期我們講到了關於函式的有參、無參、匿名函式,本期我們分享一下關於go語言函式型別、匿名函式和閉包的概念和實戰。閒話不多說,立馬開始分享。

在Go語言中,函式也是一種資料型別,我們可以通過type來定義它,它的型別就是所有擁有相同的引數,相同的返回值的一種型別。

file

        //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,Abs)
        fmt.Println("求差計算結果",calc)
        functionType := Add
        i := Calc(4,5,functionType)
        fmt.Println(i)
        }
複製程式碼

所以在Go語言中,我們不僅僅使用的是變數,常量,物件等,也是可以使用函式型別進行傳參,這個傳參是多種多樣的。

函式之匿名函式和閉包

匿名函式就是一種不需要定義函式名的函式。在Go語言裡,所有的匿名函式(Go語言規範中稱之為函式字面量)都是閉包。

匿名函式是指不需要定義函式名的一種函式實現方式,它並不是一個新概念,最早可以回溯到1958年的Lisp語言。其中我們寫一個簡單的例子

file

只是將一個匿名函式賦值給一個變數f,然後進行執行,當然最後的結果就是4啦~

當然關於匿名函式的定義是可以分很多種的。

file

溫馨提示,千萬別忘記後面的括號。此處是直接呼叫匿名函式並進行傳參。

所謂閉包就是一個函式“捕獲”了和它在同一作用域的其它常量和變數。這就意味著當閉包被呼叫的時候,不管在程式什麼地方呼叫,閉包能夠使用這些常量或者變數。

它不關心這些捕獲了的變數和常量是否已經超出了作用域,所以只有閉包還在使用它,這些變數就還會存在。

file

如圖所示,我們可以看到在外部定義了i為1 ,str是“it小棧君”,但是在匿名函式內部我們將變數重新賦值後。內部和外部都成為了100和go了。

所以由此可知函式閉包是以引用的方式捕獲外部變數。可能這樣說還是太深奧了,那麼小棧君這邊也是通過幾個示例給大家解釋一下吧。

file

我們首先定義了個普通的函式,並沒有初始化開始的值,只有當函式被呼叫的時候才進行值的初始化,分配空間為0。當函式呼叫完畢後函式值就會被釋放。所以我們得到的值就一直是2。

但是如果我們將函式型別設定成返回一個匿名函式,業務邏輯不改變的前提下,如圖所示:

file

如圖所示,我們將add2設定成返回一個匿名函式,在匿名函式中有相同的業務邏輯就是a進行自加一後,然後進行相加。

我們通過f來進行呼叫返回函式,在進行呼叫閉包函式。之前有句話說的“它不關心這些捕獲了的變數和常量是否已經超出了作用域,所以只有閉包還在使用它,這些變數就還會存在。”

只要函式還在呼叫(f()),那麼它就一直存在,然而普通函式呼叫後就直接釋放掉了。對add2的一次呼叫會生成一個區域性變數a並返回一個匿名函式。

每次呼叫時匿名函式時,該函式都會先使a的值加1,再返回a的和。第二次呼叫add2時,會生成第二個a變數,並返回一個新的匿名函式。新匿名函式操作的是第二個a變數。

通過這個例子,我們看到變數的生命週期不由它的作用域決定:add2返回後,變數a仍然隱式的存在於f中。

所以各位小夥伴也要儘量掌握關於匿名函式和閉包的概念哦,今天的分享就到這裡啦,如果你喜歡我的分享,麻煩你點選收藏、分享或再看。讓更多的小夥伴加入我們的學習陣營中來。

這裡每天會分享包含java,go,Python,大資料,人工智慧的相關乾貨,我們一起提高,一起進步。我是小棧君,我們明天再見,拜了個拜。

file

本文由部落格一文多發平臺 OpenWrite 釋出!