Go 中 goroutine 是轻量级并发单元,用 go 关键字启动;需用 sync.WaitGroup 等同步机制防止主 goroutine 提前退出导致其他协程被终止。

在 Go 中,goroutine 是轻量级的并发执行单元,由 Go 运行时管理,创建成本极低,适合高并发场景。使用 go 关键字即可启动一个 goroutine,它会异步执行函数调用,主线程无需等待。
启动 goroutine 的基本方式
只需在函数调用前加 go,该函数就会在新协程中运行:
-
go func() { fmt.Println("hello from goroutine") }()—— 启动匿名函数 -
go doWork(x, y)—— 启动已定义函数(注意:传参需传值或显式取地址)
注意:如果主 goroutine(main 函数)很快结束,其他 goroutine 可能被强制终止,因此常需同步机制控制生命周期。
等待 goroutine 完成:使用 sync.WaitGroup
当需要确保若干 goroutine 执行完毕后再继续,sync.WaitGroup 是最常用的方式:
立即学习“go语言免费学习笔记(深入)”;
AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。它不是新的编程语言,而是一种使用现有标准的新方法,最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容,不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。《php中级教程之ajax技术》带你快速
- 调用
wg.Add(n)告知预期启动的 goroutine 数量 - 每个 goroutine 结束前调用
wg.Done() - 主 goroutine 调用
wg.Wait()阻塞等待全部完成
示例:
func main() {var wg sync.WaitGroup
for i := 0; i wg.Add(1)
go func(id int) {
defer wg.Done()
fmt.Printf("Task %d done\n", id)
}(i)
}
wg.Wait()
}
安全传递数据:避免变量共享陷阱
循环中直接使用循环变量(如 for i := range items)启动 goroutine 时,容易因闭包捕获同一变量地址而引发竞态。解决方法:
- 将变量作为参数传入 goroutine(推荐):
go f(i) - 在循环内定义新变量并赋值:
val := i; go f(val) - 使用
range时注意:切片索引和元素值都需显式传参
配合 channel 实现异步通信与结果收集
goroutine 之间不建议直接共享内存,应通过 channel 通信。例如并发请求并汇总结果:
- 创建带缓冲或无缓冲 channel 接收结果
- 每个 goroutine 执行完后向 channel 发送结果:
ch - 主 goroutine 从 channel 接收所有结果(可配合
for range ch或for i := 0; i )
channel 天然支持同步,还能防止 goroutine 泄漏(若未接收,发送会阻塞),是构建可靠异步任务流的核心工具。









