【发布时间】:2021-10-13 22:55:02
【问题描述】:
当我运行以下简单代码时,它会按预期打印“ping”:
messages := make(chan string)
go func() { messages <- "ping" }()
fmt.Println(<-messages)
但是,当我使用与 select 相同的非缓冲通道时,它不会通过 ping 来完成它,因此会打印“未发送消息”:
messages := make(chan string)
select {
case messages <- "ping":
fmt.Println("sent message")
default:
fmt.Println("no message sent")
}
为什么会这样?通道是相同的,但是可以通过 goroutine 访问,但不能通过 select 访问。
此外,我发现当我将其转换为缓冲通道(大小为 1)时,它会像魅力一样完成通道:为什么?
messages := make(chan string,1)
select {
case messages <- "ping":
fmt.Println("sent message")
default:
fmt.Println("no message sent")
}
请注意,没有任何东西挂断,而是立即返回,正如我所描述的那样。
【问题讨论】:
-
这就是缓冲/非缓冲和默认情况下选择的工作原理;
-
case 1/ chan 没有空间接受该值,所以选择跳转到默认值。案例 2/ 通道有 1 个空间来接受 1 个值,因此选择会跳转到该案例。
-
@mh-cbon 第一个 sn-p 是什么?没有房间但虽然收到的那一个?
-
你有阅读器,所以它可以工作。不过,该行为与缓冲通道略有不同。下面的答案很好地解释了这一点。你理解它们有困难吗?
标签: go