Go語言-make陷阱和閉包函數

來源:互聯網
上載者:User

標籤:func   []   生命週期   組合   匿名函數   +=   直接   命令式   函數名   

Go語言make陷阱
a := make([]int, 3)a = append(a, 1, 2, 3)切片大小變成6
匿名函數

匿名函數是指不需要定義函數名的一種函數實現方式,可以直接賦值給一個變數或者直接運行

閉包
Go的匿名函數是一個閉包,閉包是可以包含自由(未綁定到特定對象)變數的代碼塊,這些變數不在這個代碼塊內或者,任何全域上下文中定義,而是在定義代碼塊的環境中定義。要執行的代碼塊(由於自由變數包含,在代碼塊中,所以這些自由變數以及它們引用的對象沒有被釋放)為自由變數提供綁定的計算環境(範圍)。

閉包的價值在於可以作為函數對象或者匿名函數。

閉包的字面定義:閉包是由函數及其相關引用環境組合而成的實體(即:閉包=函數+引用環境)。這個從字面上很難理解,特別對於一直使用命令式語言進行編程的程式員們。

閉包裡變數的生命週期跟閉包變數的周期一樣

Go中的閉包,一個函數和與其相關的引用環境組合而成的實體。

Go裡有函數類型的變數,這樣,雖然不能在一個函數裡直接聲明另一個函數,但是可以在一個函數中聲明一個函數類型的變數,此時的函數稱為閉包(closure)。

執行個體1:
package mainimport "fmt"func getSequence() func(i int) int {            sum:=0             return func(i int) int {                sum = sum +i                return sum    }}func main(){        nextNumber := getSequence()        fmt.Println(nextNumber(1))        fmt.Println(nextNumber(1))        fmt.Println(nextNumber(1))        nextNumber1 := getSequence()        fmt.Println(nextNumber1(1))        fmt.Println(nextNumber1(1))}

運行結果

12312
執行個體2
package mainimport "fmt"func getSequence() func() int {    sum:=0    return func() int {                sum += 1                return sum             }}func main(){        nextNumber := getSequence()        fmt.Println(nextNumber())        fmt.Println(nextNumber())        fmt.Println(nextNumber())        nextNumber1 := getSequence()        fmt.Println(nextNumber1())        fmt.Println(nextNumber1())}

運行結果

12312
執行個體3
package mainimport "fmt"func main(){        sum1 := 10        getSequence := func() func() int {                     sum:=0                     return func() int {                                fmt.Println(sum1)                                sum += 1                                return sum                     }        }        nextNumber := getSequence()        fmt.Println(nextNumber())        fmt.Println(nextNumber())        fmt.Println(nextNumber())        nextNumber1 := getSequence()        fmt.Println(nextNumber1())        fmt.Println(nextNumber1())        fmt.Println("end:",sum1)}

運行結果

101102103101102end: 10

Go語言-make陷阱和閉包函數

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.