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() // 等待协程执行完毕
}
###这样就能保证协程中的打印语句被执行。
posted @ 2025-07-23 20:29  Lucas_coming  阅读(18)  评论(0)    收藏  举报