在 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
这样的无条件发送操作,如果客户端还没有准备好接收和处理消息,这将阻塞,实质上阻塞所有其他客户端和集线器本身。
我无法理解以下代码摘录。 运行() 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
这样的无条件发送操作,如果客户端还没有准备好接收和处理消息,这将阻塞,实质上阻塞所有其他客户端和集线器本身。