package mainimport "fmt"// fibonacci is a function that returns// a function that returns an int.func fibonacci() func() int { a, b := 0, 1 return func() int { defer func() {a, b = b, a + b}() return a }}func main() { f := fibonacci() for i := 0; i < 10; i++ { fmt.Println(f()) }}有人可以解釋為什么輸出從 0, 1, 1, 2, 3, 5 .... 而不是 1, 1, 2, 3, 5, ..... 開始嗎?據我了解, defer 會在 return 語句之前執行,這意味著 a、b 已經更新為 1、1 并且應該返回 1?也許它與表達式被評估或綁定的時間有關,也許返回已經將 a 綁定為 0 然后在返回之前檢查是否存在 defer 語句?go 中的任何內部代碼參考都會非常有幫助。編輯 1:這是我在了解延遲后嘗試的練習https://go.dev/tour/moretypes/26 。
2 回答

繁華開滿天機
TA貢獻1816條經驗 獲得超4個贊
在更改局部變量的值為時已晚defer
之后執行。return a
a
您可能將它與defer
更改命名的返回值混淆了。這是不同的情況,因為即使在 之后更改它return
,該函數實際上也會返回它。

素胚勾勒不出你
TA貢獻1827條經驗 獲得超9個贊
有人可以解釋為什么輸出從 0, 1, 1, 2, 3, 5 .... 而不是 1, 1, 2, 3, 5, ..... 開始嗎?
如果周圍函數通過顯式 return 語句返回,則延遲函數在該 return 語句設置任何結果參數之后但在函數返回其調用者 Defer_statements之前執行
因為 defer 函數執行并將 a 的值從 0 更改為 1 但 a 的值已經是返回顯式。
func fibonacci() func() int {
a, b := 0, 1
return func() int {
defer func() {a, b = b, a + b}()
return a
}
}
- 2 回答
- 0 關注
- 110 瀏覽
添加回答
舉報
0/150
提交
取消