在Gorilla websocket的示例目录中,有一个名为hub.go的文件。
https://github.com/gorilla/websocket/blob/master/examples/chat/hub.go
在这里,您可以在类型中心上找到执行此操作的方法。
func (h *hub) run() { for { select { case c := <-h.register: h.connections[c] = true case c := <-h.unregister: if _, ok := h.connections[c]; ok { delete(h.connections, c) close(c.send) } case m := <-h.broadcast: for c := range h.connections { select { case c.send <- m: default: close(c.send) delete(h.connections, c) } } } } }
为什么在这样的最后一种情况下,它不仅仅直接发送到c.send通道?
case m := <-h.broadcast: for c := range h.connections { c.send <- m }
保证无阻塞发送到通道的方法。如果c.send chan现在不能接受新消息,则将执行默认分支。如果没有select {}块,则可以阻止发送到未缓冲或已满缓冲的通道。