我試圖理解為什么我的代碼不起作用,所以我設法在一個更簡單的例子中重現了這個問題。我希望這段代碼輸出字符串“廣播”,但它不輸出任何東西。package mainimport ( "fmt" "time")type hub struct { handle chan []byte broadcast chan []byte}func (h *hub) init() { for { select { case m := <-h.handle: handler(m) case _ = <-h.broadcast: fmt.Println("broadcasted") } }}var socketHub = hub{ handle: make(chan []byte), broadcast: make(chan []byte),}func main() { go socketHub.init() m := []byte("this is the message") socketHub.handle <- m time.Sleep(time.Second * 2)}func handler(m []byte) { // Do some stuff. socketHub.broadcast <- m}為什么這不起作用?
1 回答

紅顏莎娜
TA貢獻1842條經驗 獲得超13個贊
您的broadcast
頻道沒有緩沖。這意味著:
您將消息發送到
handle
通道:主 goroutine 阻塞,直到...在 goroutine 中,
select
case 得到消息...并調用(在 goroutine 中)
handler
,它將消息發送到broadcast
通道,阻塞直到......
就是這樣:你的子 goroutine 正在阻塞,等待自己來選擇消息。同時,您的主 goroutine 休眠,然后到達末尾main
,退出并終止程序。
您可以通過多種方式“解決”它:
使您的
broadcast
通道緩沖:這樣,goroutine 發送消息,該消息立即成功,并在for
循環中返回,選擇它并按預期打印使您
send
的(新)goroutine 在handler
中或通過go handler(m)
在您的循環中調用讓兩個不同的 goroutine 監聽
handler
和broadcast
你選擇哪一個取決于你試圖解決的確切問題:在這個小例子中,很難找到一個“最好的”。
- 1 回答
- 0 關注
- 132 瀏覽
添加回答
舉報
0/150
提交
取消