Go 中 goroutine 是轻量级并发单元,用 go 关键字启动;需用 sync.WaitGroup 等同步机制防止主 goroutine 提前退出导致其他协程被终止。
在 Go 中,goroutine 是轻量级的并发执行单元,由 Go 运行时管理,创建成本极低,适合高并发场景。使用 go 关键字即可启动一个 goroutine,它会异步执行函数调用,主线程无需等待。
只需在函数调用前加 go,该函数就会在新协程中运行:
go func() { fmt.Println("hello from goroutine") }() —— 启动匿名函数go doWork(x, y) —— 启动已定义函数(注意:传参需传值或显式取地址)注意:如果主 goroutine(main 函数)很快结束,其他 goroutine 可能被强制终止,因此常需同步机制控制生命周期。
当需要确保若干 goroutine 执
行完毕后再继续,sync.WaitGroup 是最常用的方式:
立即学习“go语言免费学习笔记(深入)”;
wg.Add(n) 告知预期启动的 goroutine 数量wg.Done()
wg.Wait() 阻塞等待全部完成示例:
func main() {循环中直接使用循环变量(如 for i := range items)启动 goroutine 时,容易因闭包捕获同一变量地址而引发竞态。解决方法:
go f(i)
val := i; go f(val)
range 时注意:切片索引和元素值都需显式传参goroutine 之间不建议直接共享内存,应通过 channel 通信。例如并发请求并汇总结果:
ch
for range ch 或 for i := 0; i )
channel 天然支持同步,还能防止 goroutine 泄漏(若未接收,发送会阻塞),是构建可靠异步任务流的核心工具。