兄弟連go教程(14)函式 - 匿名函式

尹成發表於2018-07-04
匿名函式可賦值給變數,做為結構欄位,或者在 channel ⾥裡傳送。
// --- function variable ---
fn := func() { println("Hello, World!") }
fn()
// --- function collection ---
fns := [](func(x int) int){
func(x int) int { return x + 1 },
func(x int) int { return x + 2 },

}
println(fns[0](100))
// --- function as field ---
d := struct {
fn func() string
}{
fn: func() string { return "Hello, World!" },
}
println(d.fn())
// --- channel of function ---
fc := make(chan func() string, 2)
fc <- func() string { return "Hello, World!" }
println((<-fc)())


閉包複製的是原物件指標,這就很容易解釋延遲引⽤用現象。
func test() func() {
x := 100
fmt.Printf("x (%p) = %d\n", &x, x)
return func() {
fmt.Printf("x (%p) = %d\n", &x, x)
}
}
func main() {
f := test()
f()
}


輸出:
x (0x2101ef018) = 100
x (0x2101ef018) = 100


在彙編層⾯面,test 實際返回的是 FuncVal 物件,其中包含了匿名函式地址、閉包物件指
針。當調⽤用匿名函式時,只需以某個暫存器傳遞該物件即可。
FuncVal { func_address, closure_var_pointer ... }

相關文章