我是golang的新手,這是我的目的,我想讓2個(gè)例程與一個(gè)公共頻道同時(shí)運(yùn)行,消費(fèi)者應(yīng)該在頻道創(chuàng)建后啟動(dòng)并始終獲取數(shù)據(jù)直到頻道關(guān)閉,我的代碼模板如下:var userChannel chan stringfor index := 0; index < *clientNums; index++ { wg.Add(1) go run1() go run2() } wg.Wait()}func run1() { defer wg.Done() // ...some logic userChannel = make(chan string, *readUserNums) for index := 0; index < *readUserNums; index++ { //...some logic userChannel <- userId //...some logic } close(userChannel)}func run2() { for sendId := range userChannel { //...some logic}}在我的代碼中,如果run2首先運(yùn)行它會(huì)很恐慌,因?yàn)樯形磩?chuàng)建通道并且通道中沒(méi)有數(shù)據(jù)。我怎樣才能達(dá)到我的目的?謝謝你
2 回答

守候你守候我
TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超10個(gè)贊
首先創(chuàng)建通道,然后將其傳遞到您的 goroutines 中,而不是將其存儲(chǔ)在全局中并動(dòng)態(tài)創(chuàng)建它。

米脂
TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超3個(gè)贊
即使userChannel
最初沒(méi)有數(shù)據(jù)存在,只要?jiǎng)?chuàng)建了它就不會(huì)成為問(wèn)題userChannel
,這里它失敗了,因?yàn)闆](méi)有創(chuàng)建通道。
run1
在調(diào)用或run2
傳遞通道之前創(chuàng)建通道始終是最佳實(shí)踐。
僅供參考:如果通道是由通道上沒(méi)有數(shù)據(jù)創(chuàng)建的,并且如果我們嘗試從通道中讀取數(shù)據(jù),這將是一個(gè)阻塞調(diào)用,并且將等待直到將數(shù)據(jù)接收到等待通道中。
- 2 回答
- 0 關(guān)注
- 96 瀏覽
添加回答
舉報(bào)
0/150
提交
取消