標籤: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陷阱和閉包函數