此示例取自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 specification:
程序执行从初始化主程序包开始,然后 调用函数main。当函数main返回时, 程序退出。它不等待其他(非主要)goroutines 完整。
答案 0 :(得分:5)
当您的主要功能结束时,您的程序结束,即所有goroutine终止。
您的主要终止在go say("world")
完成之前。如果你在主要结束时睡一段时间,你应该看到最后的世界。
答案 1 :(得分:4)
以下是使用sync.WaitGroup
正确解决同步问题的方法package main
import (
"fmt"
"sync"
"time"
)
func say(s string, wg *sync.WaitGroup) {
defer wg.Done()
for i := 0; i < 5; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func main() {
wg := new(sync.WaitGroup)
wg.Add(2)
go say("world", wg)
go say("hello", wg)
wg.Wait()
fmt.Println("All done")
}
答案 2 :(得分:2)
因为调用gorouting在你生成的第二个之前终止了。这导致第二个关闭。为了说明,请稍微修改您的代码:
package main
import (
"fmt"
"time"
)
func say(s string) {
for i := 0; i < 5; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Print(i)
fmt.Println(":"+s)
}
}
func main() {
go say("world")
say("hello")
}
尝试在主要功能结束时进行“等待”或睡眠。