在玩 Go 的频道和例程时,我遇到了一种奇怪的行为,我希望有人能解释一下。
下面是一个简短的程序,它应该通过通道将字符串发送到在单独的 goroutine 中运行的“侦听器”(select 语句),从而将几个字符串打印到标准输出。
package main
import (
"fmt"
"time"
)
func main() {
a := make(chan string)
go func() {
for {
select {
case <-a:
fmt.Print(<-a)
}
}
}()
a <- "Hello1\n"
a <- "Hello2\n"
a <- "Hello3\n"
a <- "Hello4\n"
time.Sleep(time.Second)
}
使用
go func() {
for s := range a {
fmt.Print(s)
}
}()
// or even simpler
go func() {
for {
fmt.Print(<-a)
}
}()
按预期工作。但是,使用 select 语句运行最上面的代码段会产生以下输出:
Hello2
Hello4
即只打印所有其他语句。这是什么魔法?