在 Golang 中,只有一个 case 子句(没有 case 表达式)和 default case 的 select 语句有什么作用?

What does a select statement with just a case clause (without case expression) and default case do in Golang?

我无法理解以下代码摘录。 运行() f-n 作为 goroutine 执行,我认为负责将 'gloabl' 广播频道中的所有条目分派到相应的客户端频道 (chan.send)。我在 case 子句中的第二个 select 语句中迷路了。它只在 client.send 通道中推送消息结构还是有更多的特定语法?

func (h *Hub) run() {
    for {
        select {
        ...
        case message := <-h.broadcast:
            for client := range h.clients[someid] { //clients = make(map[int][]*Client)
                select {
                    case client.send <- message: //???
                    default:
                        close(client.send)
                        delete(h.clients, client)
                }
            }
        }
    }
}

这叫做non-blocking发送。 Spec: Select statements:

If one or more of the communications can proceed, a single one that can proceed is chosen via a uniform pseudo-random selection. Otherwise, if there is a default case, that case is chosen. If there is no default case, the "select" statement blocks until at least one of the communications can proceed.

如果select语句的communication ops中有none个就绪,并且有default个case,不等待comm,直接选择。 ops 准备好在未来的某个时候。

有问题的代码尝试在客户端的通道上发送消息,如果未准备好,客户端将立即断开。如果发送可以继续(因为通道缓冲区中有空间或者有一个 goroutine 准备好从通道接收),则执行发送操作,然后循环继续下一次迭代(前进到下一个客户端)。

目的可能是防止缓慢或死机的客户端减慢甚至阻塞整个集线器。使用像 client.send <- message 这样的无条件发送操作,如果客户端还没有准备好接收和处理消息,这将阻塞,实质上阻塞所有其他客户端和集线器本身。