我测试过,确实chan比sync.RWLock慢。

个人体会是传统的锁当代码比较多的时候,尤其是并发goroutine多且需要多次用锁的时候很容易脑子混乱,写出错误的代码;但如果只是简单的保护一个变量这种场景(比较常见)就直接用锁就好了。

chan更多的像stream,对于需要分多个阶段处理的数据,例如生产-消费者模式,比较适合;chan还有个优点就是不用关心锁问题,只需要关注数据处理逻辑和流程,代码相对简单易读。

个人总结,如果是用于保护变量同步访问,直接用锁就好,如果是对批量数据线性处理,用chan。