为了账号安全,请及时绑定邮箱和手机立即绑定

goroutine 中的 Select 会评估所有其他语句

goroutine 中的 Select 会评估所有其他语句

Go
海绵宝宝撒 2021-05-31 13:50:09
在玩 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,然后将其打印出来。


查看完整回答
反对 回复 2021-06-07
  • 3 回答
  • 0 关注
  • 207 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信