我刚刚开始学习 Go 并遵循一个教程,其中包含以下有关 goroutines 的示例:
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 执行其他 goroutines,并在某个时候回来。 ”。示例下方给出了以下输出:
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 运行并且它的执行被延迟之后,程序say()作为普通函数执行 next ,打印“hello”然后退出.
那么哪个结果是正确的,为什么?
慕的地8271018
相关分类