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

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

Golang 閉包不存儲捕獲的變量?

Golang 閉包不存儲捕獲的變量?

Go
慕斯709654 2023-05-08 16:12:26
在下面的代碼塊中,我希望輸出為 0、1、2、3、...、9。但是,只會產生輸出 10、10、...、10。package mainimport "fmt"func adder() []func() {    out := []func(){}    for i := 0; i < 10; i++ {        out = append(out, func() { fmt.Println(i) })    }    return out}func main() {    out := adder()    for i := 0; i < 10; i++ {        out[i]()    }}我的心理模型表明每次在 for 循環中都會生成并存儲一個新函數,但事實并非如此。是否有一種解決方案可以在不修改簽名(無參數或全局變量)但仍保持 i 的當前值的情況下生成新函數?
查看完整描述

1 回答

?
心有法竹

TA貢獻1866條經驗 獲得超5個贊

每次迭代都會創建一個新函數,但它們都關閉相同的變量i。該變量在每次迭代時都會更新,直到最后一次迭代,因此當您遍歷并執行所有這些函數時,它們都引用相同的i,具有相同的值,10。


如果您不想要這種行為,則不得關閉循環變量:


for i := 0; i < 10; i++ {

    temp := i

    out = append(out, func() { fmt.Println(temp) })

}


查看完整回答
反對 回復 2023-05-08
  • 1 回答
  • 0 關注
  • 96 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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