考虑两个例子:
第一:
package main
import "fmt"
func main() {
c := make(chan int)
go func(){
c <- 1
}()
go func(){
c <- 2
}()
select {
case <-c:
fmt.Println("<-c:", <-c)
fmt.Println("<-c:", <-c)
}
}
据我所知,应该发生的是:两个 goroutine 生成并写入同一个 channel ,其中一个阻塞并等待主 goroutine 读取。
但我不明白第二个 goroutine 会发生什么。它是否因为 channel 没有缓冲而阻塞,并且它 不能通过 保存两个值设计 .
有了这篇文章,我陷入了僵局。我发现了一个类似的问题 here .
如果是这样,那么这段代码是如何运行的?
package main
import "fmt"
func main() {
c := make(chan int)
go func(){
c <- 1
}()
go func(){
c <- 2
}()
select {
case forget := <-c:
fmt.Println("forget:", forget)
fmt.Println("<-c:", <-c)
}
}
最佳答案
好的,看起来像使用 case <-c
实际上是从 channel 读取的,而不是像我想的那样简单地检查它是否具有值。
关于go - 根据选择的使用情况,向无缓冲 channel 写入两次会导致不同的结果。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58675464/