我是 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
,这将启用选择的第二种情况。您在这里观察到的是循环的第二次迭代。
- 1 回答
- 0 关注
- 88 浏览
添加回答
举报
0/150
提交
取消