在玩 Go 的通道和例程时,我遇到了一种奇怪的行为,我希望有人能解释一下。下面是一个简短的程序,它应该通过通道将字符串发送到在单独的 goroutine 中运行的“侦听器”(select 语句),从而将几个字符串打印到标准输出。package mainimport ( "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 simplergo func() { for { fmt.Print(<-a) }}()按预期工作。但是,使用 select 语句运行最上面的代码段会产生以下输出:Hello2Hello4即只打印所有其他语句。这是什么魔法?
3 回答
不负相思意
TA贡献1777条经验 获得超10个赞
<-a
破坏性地从通道中获取一个值。所以在你的代码中你得到两个值,一个在 select 语句中,一个用于打印。select 语句中收到的那个没有绑定到任何变量,因此丢失了。
尝试
select {
case val := <-a:
fmt.Print(val)
相反,要仅获取一个值,请将其绑定到变量 val,然后将其打印出来。
- 3 回答
- 0 关注
- 207 浏览
添加回答
举报
0/150
提交
取消