

新闻资讯
技术学院本文详解如何将顺序遍历切片并调用函数的操作改为真正并发执行,避免闭包变量捕获错误和切片越界 panic,推荐使用 sync.waitgroup + 预分配结果切片的简洁可靠方案。
在 Go 中实现切片元素的并发处理时,核心目标是:对每个输入值独立启动 goroutine 执行计算(如 double(i)),所有 goroutine 并行运行,主协程等待全部完成后再统一返回结果。原始代码中尝试用 []chan int 存储通道,但存在两个关键错误:
✅ 正确解法无需额外通道——直接利用预分配的结果切片 + sync.WaitGroup 即可安全、高效地完成并发写入:
func parallel(arr []int) []int {
outArr := make([]int, len(arr)) // 预分配,支持并发写入指定索引
var wg sync.WaitGroup
for i, num := range arr {
wg.Add(1)
go func(idx int, val int) {
defer wg.Done()
outArr[idx] = double(val) // 每个 goroutine 写入唯一索引,无竞争
}(i, num) // 立即传值,避免闭包捕获
}
wg.Wait() // 主协程阻塞等待所有 goroutine 完成
return outArr
}? 关键要点说明:
⚠️ 注意事项:
最终效果:输入 [7,8,9] 时,notParallel 耗时
约 1500ms(串行 3×500ms),而 parallel 仅约 500ms(并行,最长单次耗时),完美达成性能优化目标。