Go编码规范及性能优化 | 青训营笔记

75 阅读1分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第3天

高质量编程

正确可靠,简洁明晰

边界条件考虑齐全
异常处理保证稳定性
代码易读性易维护

可以使用Gofmt和goimports规范代码

注释

解释代码作用
解释代码实现过程
解释实现原因
解释什么时候出错

命名

简洁
缩略词全大写
变量距离被使用地方越远,越需要携带信息

流程控制应避免多重嵌套,优先处理异常,以尽早返回或循环,减少嵌套层数

错误和异常处理

不建议使用panic,若可以解决,用error代替。panic用于真正的异常

性能优化

使用benchmark用来评估 go test -bench=./benchmem

切片slice:

尽可能在make()初始化时提供容量信息

slice大内存及时释放:在原切片上创建新的切片,不会创建底层数组

场景:在大切片上创建小切片;原切片在内存中被引用,内存未释放

字符串处理

拼接:使用+性能最差,strings.Builder和bytes.Buffer相近,strings.Buffer更快

空结构体

空结构体可以节省内存,可作为各种场景的占位符,本身具有很强的语义

atomic包

锁是通过操作系统实现,属于系统调度;atomic是硬件实现,效率更高

sync.Mutex应该用来保护一段逻辑,而不是一个变量

非数值操作,atomic.Value能承载一个interface{}

普通应用代码不用过分追求性能;越高级优化手段,越容易出问题