前言
这是我参与「第三届青训营 -后端场」笔记创作活动的的第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语句后进先出