一尘不染

使用Go中的select发送到频道有什么好处?

go

在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
    }

阅读 166

收藏
2020-07-02

共1个答案

一尘不染

保证无阻塞发送到通道的方法。如果c.send chan现在不能接受新消息,则将执行默认分支。如果没有select
{}块,则可以阻止发送到未缓冲或已满缓冲的通道。

2020-07-02