猿问

Go 中的“go”关键字

以下是“A Tour of Go” Range 和 Close 中的代码示例:


package main


import (

    "fmt"

)


func fibonacci(n int, c chan int) {

    x, y := 0, 1

    for i := 0; i < n; i++ {

        c <- x

        x, y = y, x+y

    }

    close(c)

}


func main() {

    c := make(chan int, 10)

    go fibonacci(cap(c), c)

    for i := range c {

        fmt.Println(i)

    }

}

在从底部算起的第五行,当go关键字被省略时,结果没有改变。这是否意味着主 goroutine 在缓冲通道中发送值,然后将它们取出?


桃花长相依
浏览 181回答 1
1回答

慕哥6287543

你可以这样想:使用go关键字,该fibonacci函数将数字添加到通道中,并且一旦将for i := range c每个数字添加到通道中,循环就会将其打印出来。如果没有go关键字,该fibonacci函数被调用时,添加了所有的号码的通道,然后返回,并随后将for循环输出数字关闭channel。看到这一点的一种好方法是进入睡眠状态(操场链接):package mainimport (&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "time")func fibonacci(n int, c chan int) {&nbsp; &nbsp; x, y := 0, 1&nbsp; &nbsp; for i := 0; i < n; i++ {&nbsp; &nbsp; &nbsp; &nbsp; time.Sleep(time.Second) // ADDED THIS SLEEP&nbsp; &nbsp; &nbsp; &nbsp; c <- x&nbsp; &nbsp; &nbsp; &nbsp; x, y = y, x+y&nbsp; &nbsp; }&nbsp; &nbsp; close(c)}func main() {&nbsp; &nbsp; c := make(chan int, 10)&nbsp; &nbsp; go fibonacci(cap(c), c) // TOGGLE BETWEEN THIS&nbsp; &nbsp; // fibonacci(cap(c), c) // AND THIS&nbsp; &nbsp; for i := range c {&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(i)&nbsp; &nbsp; }}
随时随地看视频慕课网APP

相关分类

Go
我要回答