GO语言高质量编程--编码规范 | 青训营笔记

123 阅读2分钟

前言

这是我参与「第三届青训营 -后端场」笔记创作活动的的第3篇笔记, 第三次课主要讲了GO语言的高质量变成和性能调优实战,本文是针对编码规范部分做的笔记

一、代码格式

1. gofmt

gofmt是go语言官方提供的工具,可以自动格式化代码为统一的风格,可以结合goland配置使用

2. goimports

也是go语言官方提供的工具,实际等于gofmt加上依赖包管理

可以自动增删依赖包的引用,将依赖包按字母顺序排列

二、注释

1. 简介

  • 解释代码作用

  • 解释代码如何做的

  • 解释实现的原因

  • 解释什么时候会出错

  • 公共符号始终要注释

例外: 不需要注释实现接口的方法

三、命名规范

1. 变量

  • 简洁胜于冗长

  • 如果有具体含义的变量 应该在命名中体现出来

  • 缩略词全大写,当其位于变量开头且不需要导出时,使用全小写
    • 例如 ServerHTTP而不是 ServerHttp
    • 使用XMLHTTPRequest 或者xmlHTTPRequest
  • 变量距离使用的地方越远,越要携带更多的上下文信息

2. 函数

  • 函数名不携带包名的上下文信息,因为包名和函数名总是成对出现的
    • 第一个更好

  • 函数名尽量简短

3. 包名

  • 只有小写字母组成,不包含大写字母和下划线等字符
  • 简短并含有一些上下文信息
  • 不要跟标准库同名
  • 使用单数而不是复数: 如encoding而不是encodings

四、控制流程

1. 避免嵌套

2. 尽量保证代码为最小缩进

优先处理特殊/错误情况,尽早返回

五、错误和异常处理

1. 简单错误

指的是只出现一次的错误,在其他地方不需要捕获该错误

  • 优先使用errors.New 创建爱你匿名变量来直接表示简单错误
  • 有格式化的需要,使用fmt.Errorf

2. 错误的Wrap和Unwrap

  • 错误的Wrap是提供了一个error嵌套另一个error的能力,从而生成一个error跟踪链
  • 在fmt.Errorf中使用 %w 关键字来将一个错误关联至错误链中

3. 错误判定

判定一个错误是否为特定错误,使用errors.Is, 而不是==, 使用这个方法可以判定错误链上所有错误是否含有特定错误

在错误链上获取特定种类的错误,使用errors.As

4. panic

不建议在业务代码中使用panic

5. recover

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