这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
一、本堂课重点内容:
- 编码规范
- 性能调优
二、详细知识点介绍:
-
编码规范
-
自动格式化代码
可以使用 gofmt 和 goimports 工具自动格式化代码,GoLand可以直接通过 Ctrl+Alt+L 快捷键格式化代码
-
注释
- 注释应该解释代码作用
- 注释应该解释代码如何做的
- 注释应该解释代码实现的原因
- 注释应该解释代码什么情况会出错
-
命名
-
变量
- 简洁胜于冗长
- 缩略词全大写,但当其位于变量开头且不需要导出时,使用全小写
- 变量距离其被使用的地方越远,则需要携带越多的上下文信息
-
函数
- 函数名不应携带包名的上下文信息
- 尽量简短
- 当名为
foo包的某个函数返回类型为Foo时,可以省略类型信息而不导致歧义 - 当名为
foo包的某个函数返回类型为T而不是Foo时,应该在函数名中加入类型信息
-
包
- 只由小写字母组成,不包含大写字母和下划线等字符
- 简洁且包含一定的上下文信息
- 不要与标准库同名
-
-
编码规范
-
控制流程
- 避免嵌套,保持正常流程清晰
- 尽量保持正常代码路径为最小缩进
- 优先处理错误情况/特殊情况
- 尽早返回或继续循环来减少嵌套
-
错误和异常处理
- 简单错误优先使用
errors.New创建匿名变量 - 判断错误断言
errors.Is(),比起直接使用==的好处是可以判断错误链上的所有错误是否含有特定错误 - 从错误链中提取想要的错误使用
errors.As()
- 简单错误优先使用
-
-
-
性能优化
-
benchmark测试
-
slice和map的预分配
通过预分配足够的空间避免自动扩容的性能消耗
-
string的不可变性
对
string的更改(比如+=)会重新生成一个新的string。需要对string大量修改的情况使用strings.Builder或bytes.Builder,前者性能稍好。 -
空结构体的使用
空结构体
struct{},不占内存,仅作为占位符。可用于用map实现set。
-
-
性能调优
pprof工具 (暂时感觉不太会用,在实际开发中有必要)
三、实践练习例子:
pprof的实际使用演示
四、课后个人总结:
对go的编码规范和性能调优有了一定的理解,但对pprof工具的使用有问题。