Go Tour #5:选择语句示例

我是 Go 语言的新手,目前正在参加 Go 之旅。我对语句中的并发示例 5有疑问。select


下面的代码已使用打印语句进行编辑,以跟踪语句的执行。


package main


import "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: 0xc00005e0c0

Run runForLoop()

For loop with i: 0

Returned from c: 0 // question 1

For loop with i: 1

Run case: c<-x // question 2

x: 1, y: 1

Run case: c<-x // question 2

x: 1, y: 2

Returned from c: 1

For loop with i: 2

Returned from c: 1

For loop with i: 3

// ...

我的问题是


    1. 即使没有执行任何选择块,也会c在此处收到的值。0我可以确认这是具有类型的c变量的零值吗?int


    1. 为什么要c<-x执行两次?


ibeautiful
浏览 89回答 1
1回答

拉风的咖菲猫

对于 1:它打印 的结果<-c,这将阻塞直到另一个 goroutine 写入它。c<-x所以你的陈述是不正确的: ran的选择案例,with&nbsp;x=0.&nbsp;它不是 chan 变量的零值。如果通道关闭,或者如果您使用通道读取的二值形式,您只会从通道中读取 chan 类型的零值:value,ok := <-c。当ok=false,value是通道值类型的零值。For 2:c<-x将执行 10 次,因为您在 for 循环中读取了 10 次,然后才写入quit,这将启用选择的第二种情况。您在这里观察到的是循环的第二次迭代。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go