Go語言-make陷阱和閉包函數
阿新 • • 發佈:2018-06-17
相關 運行 closure Go 需要 ber enc seq sum Go語言make陷阱
a := make([]int, 3)
a = append(a, 1, 2, 3)
切片大小變成6
匿名函數
匿名函數是指不需要定義函數名的一種函數實現方式,可以直接賦值給一個變量或者直接運行
閉包
Go的匿名函數是一個閉包,閉包是可以包含自由(未綁定到特定對象)變量的代碼塊,這些變量不在這個代碼塊內或者,任何全局上下文中定義,而是在定義代碼塊的環境中定義。要執行的代碼塊(由於自由變量包含,在代碼塊中,所以這些自由變量以及它們引用的對象沒有被釋放)為自由變量提供綁定的計算環境(作用域)。
閉包的價值在於可以作為函數對象或者匿名函數。
閉包的字面定義:閉包是由函數及其相關引用環境組合而成的實體(即:閉包=函數+引用環境)。這個從字面上很難理解,特別對於一直使用命令式語言進行編程的程序員們。
閉包裏變量的生命周期跟閉包變量的周期一樣
Go中的閉包,一個函數和與其相關的引用環境組合而成的實體。
Go裏有函數類型的變量,這樣,雖然不能在一個函數裏直接聲明另一個函數,但是可以在一個函數中聲明一個函數類型的變量,此時的函數稱為閉包(closure)。
實例1:
package main import "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)) }
運行結果
1
2
3
1
2
實例2
package main import "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()) }
運行結果
1
2
3
1
2
實例3
package main
import "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)
}
運行結果
10
1
10
2
10
3
10
1
10
2
end: 10
Go語言-make陷阱和閉包函數