Go中的“go”关键字

时间:2015-09-26 06:49:42

标签: 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在缓冲通道中发送了值然后将它们取出?

1 个答案:

答案 0 :(得分:2)

你可以这样想:

使用go关键字,fibonacci功能正在向频道添加数字,而for i := range c循环正在快速打印每个数字 添加到频道。

如果没有go关键字,则会调用fibonacci函数,将所有数字添加到频道,然后返回,然后 for循环打印出channel的数字。

看到这个的一个好方法是进入睡眠状态(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)
    }
}