在下面的代碼塊中,我希望輸出為 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) })
}
- 1 回答
- 0 關注
- 96 瀏覽
添加回答
舉報
0/150
提交
取消