Golang开发最佳实践记录
Web
使用github.com/urfave/negroni管理中间件,微型、非嵌入式、鼓励使用原生 net/http 库特征的中间件 。
使用github.com/gorilla/mux路由请求。
使用github.com/yinshuwei/osm操作数据库,轻巧的Go语言ORM工具,只使用Go标准库,实现SQL模板,数据自省,支持MySQL和PostgreSQL。
JSON
使用jsoniter库(github.com/json-iterator/go,滴滴工程序写的),比标谁库要快,使用方法可以和准标库相同。可以到官网上看性能对比。
结构化日志
zap(github.com/uber-go/zap,uber开发)。
Redis
使用0号DB,减少一次Select命令。
多命令情况下使用Send+Flush+Receive,替代Do。(参考https://godoc.org/github.com/gomodule/redigo/redis#hdr-Pipelining)
语言特性
slice,map,byte.Buffer初始容量的设定可以避免扩容操作。
字符串拼接:少量字符串用'+'号,更多用strings.Join(使用slice copy),最快的方式是byte.Buffer(要注意初始容量问题),最慢的是fmt.Sprintf。
defer会增加调用代价,如果能确定回收时机就不用defer,只在复杂的return流程下使用defer。
闭包会增加垃圾扫描的数量,逃逸分析会把自由变量分配在堆上。
反射的性能差,Rob Pike说过:Clear is better than clever, Reflections is never clear(清晰比聪明更好,反射永远不清晰)。