Go语言中的"go"关键字

4

以下是“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关键字时,结果没有改变。这是否意味着主Go协程在缓冲通道中发送值,然后将它们取出?

1个回答

2
你可以这样想:
使用关键字 gofibonacci 函数将数字添加到通道中,而 for i := range c 循环会在每次添加到通道时立即打印出该数字。
没有使用关键字 gofibonacci 函数被调用后,它会将 所有 数字添加到通道中,然后返回,之后 for 循环才会从 channel 中打印数字。
一个好的方法是加入睡眠(playground 链接):
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)
    }
}

2
一个更加技术性的解释可以提到,go关键字实际上会在一个单独的线程中启动一个方法 :) - favoretti
2
它可能会在一个单独的线程中启动方法。或者它可以在同一个线程中切换主协程和新生成的斐波那契协程。这只是一个小细节,但我想确保它不会与实际的操作系统级别线程混淆。 - David Budworth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接