我正在尝试执行来自 golang.org 的示例:http://tour.golang.org/#63
- 我已经更改了代码以测试 Gosched 到底做了什么。*
你可以看到输出是:
hello
hello
hello
hello
hello
但是当我将这些代码复制到我的 Mac OS X 10.8(Go 版本 1.0.3)时,输出发生了变化: xxxxxx$ 去版本 去版本go1.0.3 xxxxxx$ 去运行 goroutine.go 你好 世界 你好 世界 你好 世界 你好 世界 你好 世界
根据这个answer ,我应该使用 runtime.GoSched,但实际上我不需要。所以我认为出了点问题。
请帮我解决这个问题,非常感谢。
最佳答案
这里的问题是您有两种不同的实现方式。
在本地,每次调用 fmt.Println 时,您的代码都会让步给调度程序。 Println 写入执行系统调用的标准输出。所有系统调用的产生方式与 runtime.Gosched 相同。
play.golang.org 是一个黑盒子。我们实际上并不知道它是如何工作的。但是,从您给出的示例来看,当调用 fmt.Println 时,play 似乎没有执行系统调用。这是有道理的。他们可能用缓冲区替换了 os.Stdout 来保存打印的内容。
关于concurrency - 相同的 Golang 代码不同的输出,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13262487/