go语言入门2 | 青训营笔记

32 阅读2分钟

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

一、高质量编程

  • 编码规范
    • 代码规范:使用gofmt和goimports工具进行开发
    • 注释:需要尽可能地解释
    • 命名规范:
      • 缩略词全大写,但当其位于变量开头且不需要导出时,使用全小写
      • 包名,只由小写字母组成。不包含大写字母和下划线等字符
    • 错误和异常处理
      • 优先使用errors.New来创建匿名变量来直接表示简单错误
      • 错误的Wrap实际上是提供了一个error嵌套另一个error的能力,从而生成一个error的跟踪链。在fmt.Errorf中使用:%w关键字来将一个错误关联至错误链中
      • 判定一个错误是否为特定错误,使用errors.Is。不同于使用==,使用该方法可以判定错误链上的所有错误是否含有特定的错误
      • 在错误链上获取特定种类的错误,使用errors.As
      • recover只能在被defer的函数中使用。嵌套无法生效。只在当前goroutine生效。defer的语句是后进先出
      • 小结
        • error尽可能提供简明的上下文信息链,方便定位问题
        • panic用于真正异常的情况
        • recover生效范围,在当前goroutine的被defer的函数中生效
  • 性能优化建议
    • 采用工具BenchMark
    • slice预分配内存
      • 尽可能在使用make()初始化切片时提供容量信息
      • 如果要在已有切片基础上创建切片,使用copy替代re-slice
    • map预分配内存
    • 字符串处理
      • 使用strings.Builder:使用+拼接性能最差,strings.Builder,bytes.Buffer相近,strings.Buffer更快
    • 空结构体
      • 使用空结构体节省内存。空结构体struct{}实例不占据任何的内存空间,可作为各种场景下的占位符使用
      • 实现Set,可以考虑用map来代替,对于这个场景,只需要用到map的键,而不需要值。
    • atomic包