我有多个 goroutines 试图同时在同一个频道上接收。似乎最后一个开始在通道上接收的 goroutine 获得了值。这是语言规范中的某个地方还是未定义的行为?
c := make(chan string)
for i := 0; i < 5; i++ {
go func(i int) {
<-c
c <- fmt.Sprintf("goroutine %d", i)
}(i)
}
c <- "hi"
fmt.Println(<-c)
输出:
goroutine 4
编辑:
我才意识到这比我想象的要复杂。消息在所有 goroutine 中传递。
c := make(chan string)
for i := 0; i < 5; i++ {
go func(i int) {
msg := <-c
c <- fmt.Sprintf("%s, hi from %d", msg, i)
}(i)
}
c <- "original"
fmt.Println(<-c)
输出:
original, hi from 0, hi from 1, hi from 2, hi from 3, hi from 4
注意: 上述输出在最新版本的 Go 中已经过时(见评论)