2 回答

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超6個(gè)贊
在定義一個(gè)使用外部作用域變量的內(nèi)部函數(shù)時(shí),我應(yīng)該將變量作為參數(shù)傳遞給內(nèi)部函數(shù)嗎?
這取決于你想要達(dá)到的目標(biāo)。
你所說(shuō)的“函數(shù)內(nèi)的函數(shù)”實(shí)際上被稱為“閉包”(有些人稱之為“l(fā)ambda”)。
閉包從外部詞法范圍捕獲變量,在其主體中引用。在 Go 中,這種捕獲是“通過(guò)引用”或“通過(guò)名稱”完成的,這基本上意味著每次調(diào)用閉包時(shí),它都會(huì)“看到”它關(guān)閉的變量的當(dāng)前值,而不是這些變量在關(guān)閉時(shí)的值被創(chuàng)建——觀察程序:
package main
import (
"fmt"
)
func main() {
i := 42
fn := func() {
fmt.Println(i)
}
fn()
i = 12
fn()
}
會(huì)輸出
42
12
相反,當(dāng)您將值作為參數(shù)傳遞給閉包調(diào)用時(shí),每次調(diào)用都會(huì)準(zhǔn)確地看到傳遞給它的值。
我希望你現(xiàn)在明白選擇什么策略在很大程度上取決于你想要什么。
從概念上講,您可能將閉包視為臨時(shí)匿名struct數(shù)據(jù)類型的實(shí)例,其字段是指向閉包關(guān)閉的變量的指針,并且每次對(duì)該閉包的調(diào)用都類似于調(diào)用一些(匿名的,唯一的) ) 該類型提供的方法(實(shí)際上,這就是編譯器通常在你背后做的來(lái)實(shí)現(xiàn)閉包)。這樣的“方法”可能有參數(shù),它是否應(yīng)該有參數(shù),什么應(yīng)該進(jìn)入類型的字段以及該方法的參數(shù)應(yīng)該是什么,可以使用您對(duì)常規(guī)類型采用的常用方法來(lái)判斷。

TA貢獻(xiàn)1840條經(jīng)驗(yàn) 獲得超5個(gè)贊
在這種情況下,這兩個(gè)功能之間沒(méi)有功能差異。正如您所注意到的,局部函數(shù)可以訪問(wèn)局部變量而無(wú)需顯式傳遞它們。在您的示例中,您可能更喜歡使用 generate1 以便于閱讀。
- 2 回答
- 0 關(guān)注
- 169 瀏覽
添加回答
舉報(bào)