我试图理解为什么我的代码不起作用,所以我设法在一个更简单的例子中重现了这个问题。我希望这段代码输出字符串“广播”,但它不输出任何东西。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 关注
- 139 浏览
添加回答
举报
0/150
提交
取消