Day07:豆包MarsCode 技术训练营第七课Go语言代码规范讲解 | 豆包MarsCode AI 刷题

62 阅读3分钟

学习目标

  1. 编写更简洁清晰的代码
  2. 了解常用Go语言程序的优化手段
  3. 熟悉Go程序性能分析工具
  4. 了解工程中性能优化的原则和流程

1 高质量编程

1.1 简介

  • 高质量代码:编写的代码能够达到正确可靠、简介清晰的目标
  • 各种便捷条件是否考虑完备
  • 异常情况处理,稳定性保证
  • 易读易维护

1.2 编码规范

如何编写高质量的Go代码

  • 代码格式
  • 注释
  • 命名规范
  • 控制流程
  • 错误和异常处理

1.2.1 代码规范-代码格式

gofmt官方提供的自动格式化代码 goimports可以自动增删依赖包引用,并将依赖包按照字母排序并分类

1.2.2 编码规范-注释

注释应该提供代码未表达出的上下文信息:

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

公共符号始终要注释:

  • 包中声明的每个公共的符号:变量、常量函数以及结构都需要注释
  • 任何即不明显也不简短的公共功能必须注释
  • 无论长度或复杂程度如何,对库中的任何函数都必须进行注释

好的代码有很多注释,坏的代码需要很多注释。

1.2.3 编码规范-命名规范

varilable变量命名

  • 简介胜于冗长
  • 缩略词全大写,但当其位于变量开头且不需要导出时,使用全小写
    • 例如使用ServeHTTP而不是ServeHttp
    • 使用XMLHTTPRequest 或者 xmlHTTPRequest
  • 变量距离被使用的地方越远,则需要携带越多的上下文信息
    • 全局变量在其名字中需要更多的上下文信息,使得在不同的地方可以轻易辨认出其含义

function 函数命名

  • 函数名不携带包名的上下文信息,因为包名赫尔函数名总是成对出现的
  • 函数名尽量简短
  • 当函数返回类型和包名一致时,可以省略类型信息而不导致歧义
  • 当函数返回类型和包名不一致时,可以在函数名中加入类型信息

package包命名

  • 只由小写字母组成。不包含大写字母和下划线等字符
  • 简短并包含一定的上下文信息
  • 不要与标准库同名

1.2.4 编码规范-控制流程

  • 避免嵌套,保持正常流程清晰
  • 尽量保持正常代码路径为最小缩进(优先处理错误情况/特殊情况,尽早返回减少嵌套)

1.2.5 编码错误-错误和异常处理

简单错误(指仅出现一次的错误,且在其他地方不需要捕获该错误):

  • 优先使用error.New来创建匿名变量来直接表示简单错误并返回
  • 如果有格式化的需求,使用fmt.Errorf

错误的Wrap和Unwrap

  • 错误的wrap实际上是提供了一个error嵌套另一个error的能力,从而生成一个errer的跟踪链
  • 在fmt.Errorff中使用:%W关键字来将一个错误关联至错误链过
  • erroes.Is()方法可以判定错误链上的所有错误是否含有特定错误
  • errors.As()方法 可以获取特定种类的错误

recover

  • recove只能在被defer的函数中使用
  • 嵌套无法生效
  • 只在当前goroutine生效 defer的语句是后进先出