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

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

函數列表中的Golang函數具有最后一個值

函數列表中的Golang函數具有最后一個值

Go
拉莫斯之舞 2021-04-08 18:18:55
在以下代碼段中,我創建了一個功能列表,按照我的觀察方式,該功能列表應包含打印數字0 1 2的功能。package mainimport "fmt"func main() {    flist := make([]func(), 0)    for i := 0; i < 3; i++ {        flist = append(flist, func() { fmt.Printf("%d ", i) })    }    for j := 0; j < 3; j++ {        flist[j]()    }}但是,所有函數flist均相同main.main.func1,輸出為3 3 3即使i在循環中永遠不會達到值3。這會讓我覺得func只是簡單地使用的地址i,每次都創建相同的func,但是i當以后調用func時,這超出了范圍。我在這里想念什么?
查看完整描述

1 回答

?
吃雞游戲

TA貢獻1829條經驗 獲得超7個贊

如果我們考慮為這些函數生成什么代碼,則確實是相同的:每次都使用相同的變量。即使i在循環后超出范圍,它仍會成為閉包的一部分,并且在閉包運行時,它的最新值會被該函數查看。循環退出時,它是3。如果要將閉包綁定到特定值并防止其進一步更改,則可以創建一個狹窄范圍的變量,如下所示:


package main


import "fmt"


func main() {

    flist := make([]func(), 0)

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

        j := i  // a different variable for each iteration

        flist = append(flist, func() { fmt.Printf("%d ", j) })

    }

    for j := 0; j < 3; j++ {

        flist[j]()

    }


查看完整回答
反對 回復 2021-04-19
  • 1 回答
  • 0 關注
  • 346 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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