3 回答

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超10個贊
函數(shù)指針表示函數(shù)的代碼。而函數(shù)字面量創(chuàng)建的匿名函數(shù)的代碼只會在內(nèi)存中存儲一次,無論返回匿名函數(shù)值的代碼運(yùn)行多少次。這意味著所有函數(shù)值(或更準(zhǔn)確地說是函數(shù)指針)都將相同。
所以你無法區(qū)分存儲在f1and 中的值f2:它們表示在調(diào)用它們時(shí)要執(zhí)行的相同代碼塊。
存儲在factory變量中的函數(shù)值返回的函數(shù)值是一個閉包。只要它可以訪問,它所引用的環(huán)境(局部變量和函數(shù)參數(shù))就會一直存在。在您的情況下,這意味著由于函數(shù)值 inf1和f2引用name封閉匿名函數(shù)的參數(shù),只要函數(shù)值( inf1和f2)可訪問,它們(來自多個調(diào)用的“它們”)將被保留。這是唯一使它們“不同”或獨(dú)特的東西,但這是從“外部”看不到的。
你會繼續(xù)打印name閉包中的地址嗎,你會看到它們是閉包的多個值的不同變量,但是如果再次調(diào)用相同的閉包(函數(shù)值),它是相同的。首先修改閉包以打印以下地址:name
factory := func(name string) func() {
return func() {
fmt.Println(name, &name)
}
}
并調(diào)用f1和f2多次:
f1()
f2()
f1()
f2()
輸出:
f1 0x1040a120
f2 0x1040a130
f1 0x1040a120
f2 0x1040a130
如您所見,如果再次調(diào)用相同的閉包,name則保留name參數(shù)并再次使用相同的參數(shù)。

TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超8個贊
https://golang.org/pkg/reflect/#Value.Pointer
如果 v 的 Kind 是 Func,則返回的指針是底層代碼指針,但不一定足以唯一標(biāo)識單個函數(shù)。唯一的保證是當(dāng)且僅當(dāng) v 是一個 nil func 值時(shí)結(jié)果為零。

TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超3個贊
實(shí)際上,*func()
在 Golang 中輸入相當(dāng)于void (*)(void)
在 C 中輸入。(我知道這一點(diǎn)是因?yàn)槲医?jīng)常使用 cgo。)
并且func()
在圍棋被定義為文字,這意味著它的類似的東西代表機(jī)器代碼,而不是一個函數(shù)指針字節(jié)的BLOB。
請注意,Golang中一切都是按值傳遞的,甚至 Go 中的函數(shù)也不例外。
var f1 func() = ... reflect.ValueOf(f1)
當(dāng)您這樣做時(shí),我認(rèn)為您正在嘗試獲取名為 的代碼塊的前 8 個字節(jié)f1
,這不是該函數(shù)的地址。
在 Go 中,您永遠(yuǎn)無法獲得 a 的地址func()
。
因?yàn)?afunc()
是文字,文字沒有地址。文字不在內(nèi)存中的任何地方。所以你不能得到一個地址。
- 3 回答
- 0 關(guān)注
- 323 瀏覽
添加回答
舉報(bào)