这是我参与「第五届青训营」伴学笔记创作活动的第 3 天
前言
作为非科班出身的研究生,到目前为止没有接受过编码规范以及调优等课本上学习不到的知识。借此机会,我学会了怎么写出高质量的代码,怎么写注释以及怎么对代码进行性能调优。
Go 代码规范及注释
编码规范
代码格式
课堂中学习到了可以使用 gofmt 和 goimports 工具自动格式化代码。我现在使用的是Goland,已经默认开启了代码自动调整格式。 以外
注释
在代码注释方面,应当做到以下几点:
- 解释代码作用,这是最基本的要求;
- 说明代码为什么要这么实现,为后续维护提供参考;
- 说明代码可能存在的bug,在什么情况下可能会出错,这点非常重要;
- 一些公共符号始终要注释,说明其作用。
命名规范
变量
- 避开默认保留关键字
- 保证可读性的情况下尽量简洁明了;
- 缩略词要么全大写,要么就全小写
- 变量距离其被使用的地方越远,命名的时候要给足信息。
函数
函数命名方法应当遵循以下规则:
- 所在包名信息不应当出现在函数名字中,冗余;
- 函数名应当尽量简短;
- 当名为
foo包的某个函数返回类型为Foo时,可以省略类型信息而不导致歧义; - 当名为
foo包的某个函数返回类型为T而不是Foo时,应该在函数名中加入类型信息。
包
- 只由小写字母组成。不包含大写字母和下划线等字符;
- 简短并包含一定的上下文信息;
- 不要和标准库同名。
- 不使用常用变量名作为包名。例如使用
bufio而不是buf; - 使用单数而不是复数。例如使用
encoding而不是encodings; - 谨慎的使用缩写。例如使用
fmt在不破坏上下文的情况下比fotmat更简短。
编码规范
编码规范对于写出高质量的代码有很大帮助,需要遵循以下规则:
控制流程编码规范
-
尽量避免嵌套,保持正常流程清晰,保证可读性,也不容易出现逻辑错误;
-
尽量保持正常代码路径为最小缩进,便于以后扩展维护;
错误和异常处理
- 简单错误优先使用 errors.New 创建匿名变量直接表示;也可以使用 fmt.Errorf进行格式化输出;
- 若要输出错误链,可以在 fmt.Errorf 中使用 %w 将一个错误关联至错误链中;
- errors.Is 判定一个错误为特性错误;
- errors.As 获取错误链上特定种类的错误;
- 只有在程序启动阶段发生不可逆转的错误时才使用 panic,通常只会在初始化阶段或者main函数里使用painic;
性能优化
在编码时可以注意以下几点:
- 尽可能为 slice 和 map 预分配内存,避免反复申请内存和复制内存;
- 可用 copy 代替 re-slice;
- 多个字符串拼接时,应该避免使用+号进行字符串拼接,每次拼接都会分配+复制内存。 应该使用 bytes.Buffer或者string.Builder;
- 当需要占位符时,可使用空结构体代替;
- 使用 atomic包通过硬件锁的方式代替软件锁修改变量,减少大量消耗;
引用
字节内部课:高质量编程与性能调优实战