go编码规范和性能调优| 青训营笔记

76 阅读2分钟

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

一、本堂课重点内容:

  • 编码规范
  • 性能调优

二、详细知识点介绍:

  • 编码规范

    • 自动格式化代码

      可以使用 gofmt 和 goimports 工具自动格式化代码,GoLand可以直接通过 Ctrl+Alt+L 快捷键格式化代码

    • 注释

      • 注释应该解释代码作用
      • 注释应该解释代码如何做的
      • 注释应该解释代码实现的原因
      • 注释应该解释代码什么情况会出错
    • 命名

      • 变量

        1. 简洁胜于冗长
        2. 缩略词全大写,但当其位于变量开头且不需要导出时,使用全小写
        3. 变量距离其被使用的地方越远,则需要携带越多的上下文信息
      • 函数

        1. 函数名不应携带包名的上下文信息
        2. 尽量简短
        3. 当名为foo包的某个函数返回类型为Foo时,可以省略类型信息而不导致歧义
        4. 当名为foo包的某个函数返回类型为T而不是Foo时,应该在函数名中加入类型信息
        1. 只由小写字母组成,不包含大写字母和下划线等字符
        2. 简洁且包含一定的上下文信息
        3. 不要与标准库同名
    • 编码规范

      • 控制流程

        1. 避免嵌套,保持正常流程清晰
        2. 尽量保持正常代码路径为最小缩进
        3. 优先处理错误情况/特殊情况
        4. 尽早返回或继续循环来减少嵌套
      • 错误和异常处理

        1. 简单错误优先使用errors.New创建匿名变量
        2. 判断错误断言errors.Is(),比起直接使用 == 的好处是可以判断错误链上的所有错误是否含有特定错误
        3. 从错误链中提取想要的错误使用errors.As()
  • 性能优化

    • benchmark测试

    • slice和map的预分配

      通过预分配足够的空间避免自动扩容的性能消耗

    • string的不可变性

      string的更改(比如+=)会重新生成一个新的string。需要对string大量修改的情况使用strings.Builderbytes.Builder,前者性能稍好。

    • 空结构体的使用

      空结构体struct{},不占内存,仅作为占位符。可用于用map实现set。

  • 性能调优

    pprof工具 (暂时感觉不太会用,在实际开发中有必要)

三、实践练习例子:

pprof的实际使用演示

四、课后个人总结:

对go的编码规范和性能调优有了一定的理解,但对pprof工具的使用有问题。