Go最佳实践
2017年6月24日 00:00
来自NSQ
nsq的官方文档的Dsign中提到一个PPThttps://speakerdeck.com/snakes/nsq-nyc-golang-meetup, 里面有这样一段话
总结一下.
- don’t be afraid of sync package
sync包里有 
- sync.Mutex(互斥锁,一读一写)
 - sync.RWMutex(读写锁,可以多读一写)
 - sync.Pool(对象池, 合理利用可以减少内存分配, 降低GC压力, 稍后写一篇博客说说)
 - sync.Once(并发控制. 适用于开几个goroutines去执行一个只执行一次的任务, 比如单例模式)
 - sync.Cond(并发控制, cond.Wait()阻塞至其他goroutie运行到cond.Signal())
 - sync.WaitGroup(并发控制. 通常用法 wg.Add增加任务数量 goroutie完成任务后执行wg.Done,任务数量减1 wg.Wait等待wg任务数量为0)
 
- goroutines are cheap not free
这句话在其他地方也看过,go func()简单好用, 创建开销也很小, 但也是有开销的. 很多情况下开固定数量worker, 用channel传递数据, 效果会更好.
go-apns2中的example是个非常好的例子.https://github.com/sideshow/apns2/blob/master/_example/channel/main.go 
注意一个问题, go里面一个goroutine panic了, 会导致进程退出, 所以go func()时第一行带上
go func(){  |