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

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

為什么即使我關(guān)閉頻道后,我的“for-select”語句仍不斷從頻道接收信息?

為什么即使我關(guān)閉頻道后,我的“for-select”語句仍不斷從頻道接收信息?

Go
30秒到達(dá)戰(zhàn)場 2023-07-26 20:05:51
我有以下代碼:package mainimport (    "fmt"    "time")func main() {    ch := make(chan int)    ch2 := make(chan int)    go func(c chan int, c2 chan int) {        for {            select {            case v := <-c:                fmt.Println(v)            case v := <-c2:                fmt.Println(v)            default:            }        }    }(ch, ch2)    ch <- 1    close(ch)    close(ch2)    time.Sleep(10 * time.Second)}當(dāng)我運(yùn)行它時,它會打印1到標(biāo)準(zhǔn)輸出,然后繼續(xù)打印0。為什么是這樣?我知道我可以檢查我的 goroutine 中的通道是否關(guān)閉,但我只想知道原因。另外,假設(shè)我想在所有(多個)通道關(guān)閉后退出 goroutine,這可能嗎?我假設(shè)一旦所有通道都關(guān)閉,我可能會在默認(rèn)情況下在所有通道關(guān)閉后退出 goroutine
查看完整描述

2 回答

?
幕布斯7119047

TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超8個贊

這是每個規(guī)范的預(yù)期行為:接收運(yùn)算符:

關(guān)閉通道上的接收操作始終可以立即進(jìn)行,在收到任何先前發(fā)送的值后生成元素類型的零值。

如果您想在從通道接收到所有值(在關(guān)閉之前在通道上發(fā)送的值)后終止循環(huán),請使用該for ... range構(gòu)造,例如:

c?:=?make(chan?int)?//?Initialize?some?channel
for?v?:=?range?c?{
????fmt.Println("Received:",?v)
}

如果您有多個通道并且希望從所有通道接收數(shù)據(jù),則可以使用多個 goroutine,每個 goroutine 都有一個for range指定的通道。

另一個解決方案是:

函數(shù)可以從多個輸入中讀取數(shù)據(jù),并通過將輸入通道復(fù)用到單個通道上來繼續(xù)執(zhí)行,直到所有輸入都關(guān)閉,該通道在所有輸入都關(guān)閉時關(guān)閉。這稱為扇入。

查看完整回答
反對 回復(fù) 2023-07-26
?
catspeake

TA貢獻(xiàn)1111條經(jīng)驗(yàn) 獲得超0個贊

Go 編程語言規(guī)范

關(guān)閉

調(diào)用 close 后,并且接收到任何先前發(fā)送的值后,接收操作將返回通道類型的零值,而不會阻塞。

接收操作員

關(guān)閉通道上的接收操作始終可以立即進(jìn)行,在收到任何先前發(fā)送的值后生成元素類型的零值。


查看完整回答
反對 回復(fù) 2023-07-26
  • 2 回答
  • 0 關(guān)注
  • 173 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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