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(清晰比聪明更好,反射永远不清晰)。