这是我参与「第三届青训营 -后端场」笔记创作活动的的第5篇笔记。
什么是高质量
编写的代码能够达到正确可靠、简洁清晰的目标可称之位高质量代码
- 各种边界条件是否考虑完备
- 异常情况处理,稳定性保证
- 易读易维护
编程原则
实际应用场景千变万化,各种语言的特性和语法各不相同但是高质量编程遵循的原则是相通的
简单性
- 消除“多余的复杂性”,以简单清晰的逻辑编写代码
- 不理解的代码无法修复改进
可读性
- 代码是写给人看的,而不是机器
- 编写可维护代码的第一步是确保代码可读
生产力
团队整体工作效率非常重要
注释
代码是最好的注释
注释应该提供代码未表达出的上下文信息
编码规范——命名规范
function ·函数名不携带包名的上下文信息,因为包名和函数名总是成对出现的
·函数名尽量简短
·当名为foo的包某个函数返回类型Foo时,可以省略类型信息而不导致歧义
·当名为foo 的包某个函数返回类型T时(T并不是 Foo),可以在函数名中加入类型信息
http.serve更好,利用包名的上下文信息,只存在本包的上下文,如果再加上会有冗余
包名的命名
package
·只由小写字母组成。不包含大写字母和下划线等字符
·简短并包含一定的上下文信息。例如schema、task等
不要与标准库同名。例如不要使用 sync或者strings
以下规则尽量满足,以标准库包名为例
- 不使用常用变量名作为包名。例如使用bufio而不是 buf
- 使用单数而不是复数。例如使用encodina而不是 encodinas
- 谨慎地使用缩写。例如使用fmt在不破坏上下文的情况下比 format更加简短
小结
核心目标是降低阅读理解代码的成本
重点考虑上下文信息,设计简洁清晰的名称
错误判定
- 判定一个错误是否为特定错误,使用errors.ls
- 不同于使用==,使用该方法可以判定错误链上的所有错误是否含有特定的错误
性能优化建议——Map
map预分配内存
分析
- 不断向map中添加元素的操作会触发
- map的扩容提前分配好空间可以减少内存拷贝和 Rehash的消耗
- 建议根据实际需求提前预估好需要的空间
优化建议String字符串
使用strings.Builder
·使用+拼接性能最差,strings.Builder,bytes.Buffer相近,strings.Buffer更快
分析
- 字符串在Go语言中是不可变类型,占用内存大小是固定的
- 使用+每次都会重新分配内存
- strings.Builder,bytes.Buffer 底层都是[byte数组
- 内存扩容策略,不需要每次拼接重新分配内存1
小结
- 避免常见的性能陷阱可以保证大部分程序的性能
- 普通应用代码,不要一味地追求程序的性能
- 越高级的性能优化手段越容易出现问题
- 在满足正确可靠、简洁清晰的质量要求的前提下提高程序性能
\