在 Go 开发中,高并发下安全处理数据是最常见的场景之一:批量处理、并发计算、异步采集…… 但很多人一上来就用 sync.Mutex,结果性能差、锁竞争激烈,还不知道怎么优化。
今天我就用一段代码从慢到快、从不安全到可控的完整演进过程,带你彻底搞懂:
Mutex → sync.Map → 无锁 Channel → 限流 Channel
四种方案的优缺点、性能差异、适用场景,全部是生产可直接用的实战代码。
需求场景
我们要做一件最简单的事:
把切片 a := []int{1,2,…,10}
并发遍历,把结果安全收集到切片 b 中。
目标:并发安全 + 速度快 + 内存可控 + 不 panic
1. 初代方案:sync.Mutex 加锁(最慢、锁竞争激烈)
代码实现
package main
import (
\”fmt\”
\”sync\”
)
func main() {
a := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
var b []int
wg := sync.WaitGroup{}
var mu sync.Mutex
for _, v := range a {
wg.Add(1)
go func(v int) {
d




