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

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

go 閉包問題

go 閉包問題

慕運(yùn)維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()}運(yùn)行結(jié)果輸出:begingetvalue5getvalue5getvalue5getvalue5getvalue5end不給匿名函數(shù)傳參的話,為什么只能獲取最后一個(gè)值,其中原理還是想不太明白,請各位大哥給講解下,謝謝!?。?
查看完整描述

2 回答

?
狐的傳說

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

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

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

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

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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