go学习笔记:go func() { ... }() 启动了一个新的协程,为什么go 后面的函数没有打印?
代码如下:
func main() {
go func() {
fmt.Println("run goroutine in closure")
}()
}
原因分析:
go func() { ... }() 启动了一个新的协程(goroutine),但主函数 main() 在启动协程后立即结束。
Go 程序中,只要主协程(main goroutine)退出,所有其他还未完成的协程都会被强制终止,不会继续执行。
所以,fmt.Println("run goroutine in closure") 很可能还没来得及执行,主程序就已经退出了,因此你看不到打印结果。
解决方法:
import (
"fmt"
"time"
)
func main() {
go func() {
fmt.Println("run goroutine in closure")
}()
time.Sleep(100 * time.Millisecond) // 主协程等待,保证子协程有机会执行
}
或者使用 sync.WaitGroup:
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
wg.Add(1)
go func() {
fmt.Println("run goroutine in closure")
wg.Done()
}()
wg.Wait() // 等待协程执行完毕
}
###这样就能保证协程中的打印语句被执行。

浙公网安备 33010602011771号