我正在经历一次“环游之旅”。并且一直在编辑大部分课程,以确保我完全理解它们。我有一个问题:https://tour.golang.org/concurrency/1
package main
import (
"fmt"
"time"
)
func say(s string) {
for i := 0; i < 5; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func main() {
go say("world")
say("hello")
}
离开main
它的方式会产生一个hellos和worlds的随机排序,因为每次程序运行时线程都以不同的顺序执行。我有两个问题:
go
并将其添加到hello行,则会打印5次世界,并且根本不打印hello。这是为什么? go
,则根本不会打印任何内容。这是为什么? 我有一些使用C ++并发的经验(虽然它是前一段时间)和一些最近使用Python的经验,但会描述我在并发性方面相当新手级别的整体体验。
谢谢!
答案 0 :(得分:5)
在您有机会看到结果之前,程序会终止。
您可以通过添加一个语句来解决此问题,该语句可确保main
在其他例程完成之前不会退出。
使用goroutine,我们立即返回到下一行,并且不要等待该功能完成。
他们给出了一个代码示例:
package main
import "fmt"
func f(n int) {
for i := 0; i < 10; i++ {
fmt.Println(n, ":", i)
}
}
func main() {
go f(0)
var input string
fmt.Scanln(&input)
}
关于上面的代码:
这就是为什么包含对Scanln功能的调用; 如果没有它,程序将在有机会打印所有数字之前退出。