亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

golang 中的延遲、返回和參數評估

golang 中的延遲、返回和參數評估

Go
慕俠2389804 2022-12-05 17:22:32
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 aa

您可能將它與defer更改命名的返回值混淆了。這是不同的情況,因為即使在 之后更改它return,該函數實際上也會返回它。


查看完整回答
反對 回復 2022-12-05
?
素胚勾勒不出你

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

    }

}


查看完整回答
反對 回復 2022-12-05
  • 2 回答
  • 0 關注
  • 110 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號