第一个 goroutine 例子,奇怪的结果

这个例子取自tour.golang.org/#63


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")

}

输出

hello

world

hello

world

hello

world

hello

world

hello

为什么world只打印4时间而不是5?


编辑:答案可以从golang 规范中引用:


程序执行首先初始化主包,然后调用函数 main。当函数 main 返回时,程序退出。它不会等待其他(非主)goroutine 完成。


慕少森
浏览 189回答 3
3回答

慕姐8265434

当您的主函数结束时,您的程序结束,即所有 goroutine 都终止。您的主要在go say("world")完成之前终止。如果你在 main 的结尾睡了一段时间,你应该会看到最后一个世界。

互换的青春

因为调用 gorouting 在您生成的第二个之前终止。这会导致第二个关闭。为了说明,稍微修改您的代码:package mainimport (&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "time")func say(s string) {&nbsp; &nbsp; for i := 0; i < 5; i++ {&nbsp; &nbsp; &nbsp; &nbsp; time.Sleep(100 * time.Millisecond)&nbsp; &nbsp; &nbsp; &nbsp; fmt.Print(i)&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(":"+s)&nbsp; &nbsp; }}func main() {&nbsp; &nbsp; go say("world")&nbsp; &nbsp; say("hello")}尝试将“等待”或睡眠放在主函数的末尾。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go