【发布时间】:2016-03-28 11:35:32
【问题描述】:
我刚刚开始学习 Go,并按照包含以下 goroutine 示例的教程进行操作:
package main
import (
"fmt"
"runtime"
)
func say(s string) {
for i := 0; i < 5; i++ {
runtime.Gosched()
fmt.Println(s)
}
}
func main() {
go say("world") // create a new goroutine
say("hello") // current goroutine
}
它声明“runtime.Gosched() 意味着让 CPU 执行其他 goroutine,并在某个时候返回。”。示例下方给出了以下输出:
hello
world
hello
world
hello
world
hello
world
hello
但是,当我使用 go run 在我的机器上运行此示例时,我得到了
hello
world
world
world
world
world
hello
hello
hello
hello
我的 Go 版本是 go version go1.6 darwin/amd64。
实际上我不明白这两个结果!为什么不只是
hello
?据我了解Go程序在程序的最后一条语句执行后退出,所以我认为say()作为goroutine运行并延迟执行后,程序执行nextsay()作为普通函数,打印“你好”,然后退出。
那么哪个结果是正确的,为什么?
【问题讨论】:
-
看看这个。 related question