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

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

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

因此在Go語言中,咱們不單單使用的是變量,常量,對象等,也是可使用函數類型進行傳參,這個傳參是多種多樣的。函數

函數之匿名函數和閉包學習

匿名函數就是一種不須要定義函數名的函數。在Go語言裏,全部的匿名函數(Go語言規範中稱之爲函數字面量)都是閉包。大數據

匿名函數是指不須要定義函數名的一種函數實現方式,它並非一個新概念,最先能夠回溯到1958年的Lisp語言。其中咱們寫一個簡單的例子人工智能

file

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

固然關於匿名函數的定義是能夠分不少種的。對象

file

舒適提示,千萬別忘記後面的括號。此處是直接調用匿名函數並進行傳參。blog

所謂閉包就是一個函數「捕獲」了和它在同一做用域的其它常量和變量。這就意味着當閉包被調用的時候,無論在程序什麼地方調用,閉包可以使用這些常量或者變量。生命週期

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

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 發佈!

相關文章
相關標籤/搜索