Go中的“go”关键字

以下是“A Tour of Go”
Range and 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在缓冲通道中发送了值然后将它们取出?

最佳答案 你可以这样想:

使用go关键字,fibonacci函数正在向通道添加数字,并且for i:= range c循环在将每个数字添加到通道后立即打印出来.

如果没有go关键字,则调用fibonacci函数,将所有数字添加到通道,然后返回,然后for循环打印通道上的数字.

看到这个的一个好方法就是睡觉(playground link):

package main

import (
    "fmt"
    "time"
)

func fibonacci(n int, c chan int) {
    x, y := 0, 1
    for i := 0; i < n; i++ {
        time.Sleep(time.Second) // ADDED THIS SLEEP
        c <- x
        x, y = y, x+y
    }
    close(c)
}

func main() {
    c := make(chan int, 10)
    go fibonacci(cap(c), c) // TOGGLE BETWEEN THIS
    // fibonacci(cap(c), c) // AND THIS
    for i := range c {
        fmt.Println(i)
    }
}
点赞