GO的代码规范与性能调优 | 青训营笔记

76 阅读3分钟

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

GO高质量编程

这节课学习的是一些写代码时后的一些规范问题,我觉得这门课不错,无论是什么语言,在写代码的时候都要有自己的写代码的一些好习惯,以下是我总结的在GO语言中大一些代码规范

编码规范

可以使用gofmt或者goimports工具自动格式化代码,本人用的是VSCode,每次保存都会帮我自动规范代码。

注释

每个写代码的人都应该养成写注释的习惯,但是写的注释必须是好的注释,这样无论是别人阅读你的代码还是以后回过头来阅读自己的代码都会很方便理解为什么要这么做,那么好的注释就包括以下几点:

  • 需要解释代码的作用
  • 解释代码是如何做的
  • 解释代码实现的原因
  • 解释代码什么情况下会出错
  • 公共符号始终要注释(但不需要注释实现接口的方法)

命名规范

变量

  • 变量命名时需要简洁明了,不需要一大串英文
  • 适当的用缩写,但是当其位于开头且不需要导出的时候,使用全小写
  • 变量距离其被使用的地方越远,则需要携带更多的上下文信息(尤其是全局变量)

函数

  • 函数名不应该携带包名的上下文信息
  • 不能和标准库的函数同名,这个在c++里面有函数重载这个多态的特性在,不知道GO为什么没有
  • 函数名应该尽量简洁
  • 当名为 foo 包的某个函数返回类型为 Foo 时,可以省略类型信息而不导致歧义
  • 当名为 foo 包的某个函数返回类型为 T 而不是 Foo 时,应该在函数名中加入类型信息

  • 只由小写字母组成。不包含大写字母和下划线等字符
  • 简洁明了,包含一定的上下文信息
  • 避免和标准库同名
  • 不使用常用变量名作为包名。例如使用 bufio 而不是 buf
  • 使用单数而不是复数。例如使用 encoding 而不是 encodings
  • 谨慎的使用缩写。例如使用 fmt 在不破坏上下文的情况下比 fotmat 更简短

编码规范

控制流程

  • 避免嵌套,保持流程清晰
  • 尽量保持代码为最小缩进

错误和异常处理

  • 对于简单错误(只出现过一次),errors.New创建匿名变量直接表示;如果有格式化需求,fmt.Errorf,在fmt.Errorf中使用%w将一个错误关联至错误链中
  • 可以使用 errors.Is 判定一个错误为特性错误,比起直接使用 == 的好处是可以判断错误链上的所有错误是否含有特定错误
  • 可以使用 errors.As 获取错误链上特定种类的错误

性能优化

  • 使用 Benchmark 进行基准测试
  • 尽可能的使用切片(slice)和map与分配内存
  • 注意为切片创建切片不会创建新的底层数组,这可能会导致内存泄漏发生,此时可用 copy 代替 re-slice
  • 多个字符串拼接时,使用 strings.Builder 比直接使用 + 或使用 bytes.Buffer 更快,原理我也不清楚
  • 当需要占位符时,可使用空结构体(struct{})代替,其不会占据镇和内存空间,感觉有点像C++中符号重载的时候需要用占位符来区分
  • 使用atomic包代替锁修改变量