“这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
GO高质量编程
代码格式:
可以使用 gofmt 和 goimports 工具自动格式化代码。对于 GoLand,可以在 *Settings - Tools - Actions on Save* 中打开 *Reformat code* 和 *Optimize imports*(不出意外的话,它们应当是默认启用的)。也可通过 Ctrl+Alt+L 快捷键格式化代码(其实所有 Jetbrains 的 IDE 都支持使用这个快捷键格式化代码)
注释:
好的注释应该能做到解释代码作用,让阅读者了解代码思路,对于变量定义能进行解释,
命名规范
简洁大于冗长,缩略词全大写,我个人比较喜欢用大驼峰命名法。
函数
- 函数名不应携带包名的上下文信息,因为两者总是成对出现;
- 函数名应当尽量简短;
- 当名为
foo包的某个函数返回类型为Foo时,可以省略类型信息而不导致歧义; - 当名为
foo包的某个函数返回类型为T而不是Foo时,应该在函数名中加入类型信息。
包
- 只由小写字母组成。不包含大写字母和下划线等字符;
- 简短并包含一定的上下文信息;
- 不要和标准库同名。
- 不使用常用变量名作为包名。例如使用
bufio而不是buf; - 使用单数而不是复数。例如使用
encoding而不是encodings; - 谨慎的使用缩写。例如使用
fmt在不破坏上下文的情况下比fotmat更简短。
总体来说,Go 的包命名规范也体现了 Go 大道至简的风格。
错误和异常处理
- 对于简单错误(仅出现一次,在其他地方不需要捕获),优先使用
errors.New创建匿名变量直接表示;如有格式化需求,使用fmt.Errorf; - 在
fmt.Errorf中使用%w将一个错误关联至错误链中; - 使用
errors.Is判定一个错误为特性错误,比起直接使用==的好处是可以判断错误链上的所有错误是否含有特定错误; - 使用
errors.As获取错误链上特定种类的错误; - 只有在程序启动阶段发生不可逆转的错误时才使用
panic(类似于 Javajava.lang.Error的地位,但是 Go 可以使用revover语句来从panic中恢复;