golang 閉包

劍塵發表於2018-09-11

1.匿名函式的建立
a.fplus := func(x, y int) int { return x + y },然後通過變數名對函式進行呼叫:fplus(3,4)
b.直接對匿名函式進行呼叫:func(x, y int) int { return x + y } (3, 4)

下面是一個計算從 1 到 1 百萬整數的總和的匿名函式:
func() {
sum := 0
for i := 1; i <= 1e6; i++ {
sum += i
}
}()
2.迴圈中最好不要使用匿名函式
下面的例子展示瞭如何將匿名函式賦值給變數並對其進行呼叫(function_literal.go):
package main
import "fmt"
func main() {
f()
}
func f() {
for i := 0; i < 4; i++ {
g := func(i int) { fmt.Printf("%d ", i) } //此例子中只是為了演示匿名函式可分配不同的記憶體地址,在現實開發中,不應該把該部分資訊放置到迴圈中。
g(i)
fmt.Printf(" - g is of type %T and has value %v\n", g, g)
}
}
輸出:

0 - g is of type func(int) and has value 0x681a80
1 - g is of type func(int) and has value 0x681b00
2 - g is of type func(int) and has value 0x681ac0
3 - g is of type func(int) and has value 0x681400

我們可以看到變數 g 代表的是 func(int),變數的值是一個記憶體地址。
所以我們實際上擁有的是一個函式值:匿名函式可以被賦值給變數並作為值使用。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章