根据 select 用法,向无缓冲通道写入两次会导致不同的结果。为什么?
Writing twice to an unbuffered channel lead to different results depending on the select usage. Why?
考虑两个例子:
第一个:
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 产生并写入同一个通道,其中一个阻塞并等待主 goroutine 读取。
但是我不明白第二个 goroutine 会发生什么。它是否因为通道没有缓冲而阻塞,并且它 不能 通过 design.
保存两个值
这篇文章让我陷入僵局。我发现了一个类似的问题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
实际上是从通道中读取的,而不是像我想的那样简单地检查它是否具有值。
考虑两个例子:
第一个:
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 产生并写入同一个通道,其中一个阻塞并等待主 goroutine 读取。
但是我不明白第二个 goroutine 会发生什么。它是否因为通道没有缓冲而阻塞,并且它 不能 通过 design.
保存两个值这篇文章让我陷入僵局。我发现了一个类似的问题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
实际上是从通道中读取的,而不是像我想的那样简单地检查它是否具有值。