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

Go Tour #5:选择语句示例

Go Tour #5:选择语句示例

Go
ibeautiful 2022-06-13 17:09:35
我是 Go 语言的新手,目前正在参加 Go 之旅。我对语句中的并发示例 5有疑问。select下面的代码已使用打印语句进行编辑,以跟踪语句的执行。package mainimport "fmt"func fibonacci(c, quit chan int) {    x, y := 0, 1    fmt.Printf("Run fib with c: %v, quit: %v\n", c, quit)    for {        select {        case c <- x:            fmt.Println("Run case: c<-x")            x, y = y, x+y            fmt.Printf("x: %v, y: %v\n", x, y)        case <-quit:            fmt.Println("Run case: quit")            fmt.Println("quit")            return        }    }}func runForLoop(c, quit chan int) {    fmt.Println("Run runForLoop()")        for i := 0; i < 10; i++ {        fmt.Printf("For loop with i: %v\n", i)        fmt.Printf("Returned from c: %v\n", <-c)    }        quit <- 0}func main() {    c := make(chan int)    quit := make(chan int)    go runForLoop(c, quit)    fibonacci(c, quit)}以下内容打印到控制台。Run fib with c: 0xc00005e060, quit: 0xc00005e0c0Run runForLoop()For loop with i: 0Returned from c: 0 // question 1For loop with i: 1Run case: c<-x // question 2x: 1, y: 1Run case: c<-x // question 2x: 1, y: 2Returned from c: 1For loop with i: 2Returned from c: 1For loop with i: 3// ...我的问题是即使没有执行任何选择块,也会c在此处收到的值。0我可以确认这是具有类型的c变量的零值吗?int为什么要c<-x执行两次?
查看完整描述

1 回答

?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

对于 1:它打印 的结果<-c,这将阻塞直到另一个 goroutine 写入它。c<-x所以你的陈述是不正确的: ran的选择案例,with x=0. 它不是 chan 变量的零值。如果通道关闭,或者如果您使用通道读取的二值形式,您只会从通道中读取 chan 类型的零值:value,ok := <-c。当ok=false,value是通道值类型的零值。

For 2:c<-x将执行 10 次,因为您在 for 循环中读取了 10 次,然后才写入quit,这将启用选择的第二种情况。您在这里观察到的是循环的第二次迭代。


查看完整回答
反对 回复 2022-06-13
  • 1 回答
  • 0 关注
  • 88 浏览
慕课专栏
更多

添加回答

举报

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