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

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

GoRoutines,帶有 WaitGroup 意外輸出的通道

GoRoutines,帶有 WaitGroup 意外輸出的通道

Go
人到中年有點甜 2021-11-01 10:54:10
我看了一些我很久以前寫的代碼,當(dāng)時 go1.3 發(fā)布(我可能錯了)。代碼在這里下面的代碼曾經(jīng)按預(yù)期工作,但現(xiàn)在因為我已經(jīng)更新go到當(dāng)前的主版本(go version devel +bd1efd5 Fri Jul 31 16:11:21 2015 +0000 darwin/amd64),最后的輸出消息c <- "FUNC 1 DONE"沒有打印,代碼正常工作play.golang.org。我做錯了什么,還是這是一個錯誤?package mainimport ("fmt";"sync";"time")func test(c chan string, wg *sync.WaitGroup) {  defer wg.Done()  fmt.Println("EXEC FUNC 1")  time.Sleep(3 * time.Second)  c <- "FUNC 1 DONE"}func test1(c chan string, wg *sync.WaitGroup) {  defer wg.Done()  fmt.Println("EXEC FUNC 2")  time.Sleep(2 * time.Second)  c <- "FUNC 2 DONE"}func main() {  ch := make(chan string)  var wg sync.WaitGroup  wg.Add(2)  go test(ch, &wg)  go test1(ch, &wg)  go func(c chan string) {    for txt := range c {      fmt.Println(txt)    }  }(ch)  wg.Wait()}更新:我不是說,以上是完成這些類型工作的最佳方式,但我認(rèn)為它沒有任何問題。同時運行它go version go1.4.2 darwin/amd64會返回預(yù)期的輸出。
查看完整描述

1 回答

?
Helenr

TA貢獻1780條經(jīng)驗 獲得超4個贊

你的代碼一直有這個錯誤。您的程序在 main 退出之前設(shè)法打印了所有消息,這只是偶然的。


為了使其正常工作,我會反轉(zhuǎn)您擁有wg.Wait()和通道接收的位置,以便您可以異步關(guān)閉通道。這種方式接收操作是阻塞的main,一旦所有發(fā)送操作完成,通道就會關(guān)閉。


func main() {

    ch := make(chan string)


    var wg sync.WaitGroup

    wg.Add(2)


    go test(ch, &wg)

    go test1(ch, &wg)


    go func() {

        wg.Wait()

        close(ch)

    }()


    for txt := range ch {

        fmt.Println(txt)

    }

}


查看完整回答
反對 回復(fù) 2021-11-01
  • 1 回答
  • 0 關(guān)注
  • 198 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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