第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

go 閉包問題

go 閉包問題

慕運維8079593 2019-08-05 22:46:32
代碼如下:packagemainimport("fmt""sync""time")vara=[...]int{1,2,3,4,5}funcRun(){fmt.Println("begin")varwgsync.WaitGroupwg.Add(len(a))for_,i:=rangea{/*gofunc(iint){//函數(shù)變量是以值的方式傳遞的fmt.Printf("getvalue%d\n",i)time.Sleep(time.Second)wg.Done()}(i)*/gofunc(){fmt.Printf("getvalue%d\n",i)time.Sleep(time.Second)wg.Done()}()}wg.Wait()fmt.Println("end")}funcmain(){Run()}運行結(jié)果輸出:begingetvalue5getvalue5getvalue5getvalue5getvalue5end不給匿名函數(shù)傳參的話,為什么只能獲取最后一個值,其中原理還是想不太明白,請各位大哥給講解下,謝謝?。。?
查看完整描述

2 回答

?
狐的傳說

TA貢獻(xiàn)1804條經(jīng)驗 獲得超3個贊

你可以認(rèn)為是調(diào)度問題
有兩點需要注意:
i不是每次循環(huán)的局部變量,而是整個for塊的全局變量,你的所有routine中的i引用的是同一個i
新開routine是一個費時操作,而循環(huán)卻非???,所以還沒有等到一個routine引用i,for循環(huán)就結(jié)束了,此時的i已經(jīng)就是最后一個值了
                            
查看完整回答
反對 回復(fù) 2019-08-05
?
長風(fēng)秋雁

TA貢獻(xiàn)1757條經(jīng)驗 獲得超7個贊

這是golang很經(jīng)典的問題。當(dāng)在循環(huán)中啟動協(xié)程時,協(xié)程的啟動一定不會跟循環(huán)同步。你閉包執(zhí)行的值是什么取決于協(xié)程啟動時循環(huán)到的位置。就像你的例子,當(dāng)你的for循環(huán)完之后,你定義的go協(xié)程才啟動執(zhí)行,這個時候你的i值統(tǒng)一都是5.如果你當(dāng)初參數(shù)傳入,那么這個值就是是定義閉包時,循環(huán)到的值了。
                            
查看完整回答
反對 回復(fù) 2019-08-05
  • 2 回答
  • 0 關(guān)注
  • 359 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號