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

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

Go 通道未接收/打印發(fā)送到通道的最后一個值

Go 通道未接收/打印發(fā)送到通道的最后一個值

Go
翻翻過去那場雪 2023-07-10 16:45:30
這是一段代碼,它輸出推送到通道的整數列表。否則,選擇檢查并打印必要的超時消息。package mainimport (    "fmt"    "sync"    "time")var wg sync.WaitGroupfunc main() {    wg.Add(1)    c := make(chan int)    go readFromChannel(c, time.After(time.Duration(2)*time.Second))//  time.Sleep(time.Duration(5) * time.Second) //Talking about uncommenting this line    c <- 10    c <- 20    c <- 30    c <- 40    c <- 50    wg.Wait()}func readFromChannel(c chan int, ti <-chan time.Time) {    defer wg.Done()    go func() {        for {            select {            case x := <-c:                fmt.Println("Read", x)            case t :=<-ti:                fmt.Println("TIMED OUT with "+t.String())            }        }    }()}另外,這里還有相同的游樂場鏈接: https: //play.golang.org/p/4hNWze4Pfwr 此代碼輸出整數列表,例如Read 10Read 20Read 30Read 40Read 50但是,當我取消注釋使主例程進入睡眠狀態(tài) 5 秒的行(在代碼中稱為注釋/行號 16)時,輸出更改為:TIMED OUT with 2009-11-10 23:00:02 +0000 UTC m=+2.000000001Read 10Read 20Read 30Read 40我想了解為什么Read 50在第二種情況下沒有打印最后一個。
查看完整描述

1 回答

?
大話西游666

TA貢獻1817條經驗 獲得超14個贊

問題是你的wg.Done()位置不對。它必須在你的 goroutine 中,但是你在 goroutine 啟動之前執(zhí)行它,所以你的程序很可能在做任何工作之前退出。


改變這個:


defer wg.Done()

go func() {

對此:


go func() {

    defer wg.Done()

當然,你將擁有一個無限運行的 goroutine,因為你的for循環(huán)沒有退出條件。您需要添加一個,可能是通過檢查通道關閉來添加:


        select {

        case x, ok := <-c:

            if !ok { // channel was closed

                return

            }

            fmt.Println("Read", x)

        case t :=<-ti:

            fmt.Println("TIMED OUT with "+t.String())

        }

然后告訴你的主 go 例程在完成后關閉通道:


c <- 40

c <- 50

close(c)  // We're done, so tell the goroutine to finish up

wg.Wait() // But wait until it's done


查看完整回答
反對 回復 2023-07-10
  • 1 回答
  • 0 關注
  • 117 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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