我是 Golang 新手,所以正在关注(Go 之旅。
我在代码编辑器中修改了代码如下:
package main
import (
"fmt"
"time"
)
func say(s string) {
for i := 0; i < 3; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func run() {
go say("A")
say("B")
}
func main() {
run()
}
它产生以下并发输出:
B
A
A
B
B
但是如果我将
say("B")
更改为 go say("B")
,程序将终止而不产生任何输出。
我预计会出现类似的并发输出,因为该函数正在将两个单独的 Goroutines 生成到不同的线程中。但我相信该函数正在返回并在 Goroutine 启动之前终止进程。
您的程序正在启动 goroutines,然后立即退出,因此 goroutines 没有时间产生输出。您需要等待 goroutines 完成 - 一种方法是使用
WaitGroup
:
package main
import (
"fmt"
"sync"
"time"
)
func say(s string) {
for i := 0; i < 3; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func run() {
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
say("A")
}()
wg.Add(1)
go func() {
defer wg.Done()
say("B")
}()
wg.Wait()
}
func main() {
run()
}