2 回答

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

TA貢獻1840條經驗 獲得超5個贊
在這種情況下,這兩個功能之間沒有功能差異。正如您所注意到的,局部函數可以訪問局部變量而無需顯式傳遞它們。在您的示例中,您可能更喜歡使用 generate1 以便于閱讀。
- 2 回答
- 0 關注
- 194 瀏覽
添加回答
舉報