猿问

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

在玩 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

即只打印所有其他语句。这是什么魔法?




海绵宝宝撒
浏览 208回答 3
3回答

不负相思意

<-a破坏性地从通道中获取一个值。所以在你的代码中你得到两个值,一个在 select 语句中,一个用于打印。select 语句中收到的那个没有绑定到任何变量,因此丢失了。尝试select {&nbsp; &nbsp; case val := <-a:&nbsp; &nbsp; &nbsp; &nbsp; fmt.Print(val)相反,要仅获取一个值,请将其绑定到变量 val,然后将其打印出来。
随时随地看视频慕课网APP

相关分类

Go
我要回答