这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
零、前言
本文记录和整理了本堂课容易遗忘和比较零碎的知识点,撰写本文的目的一是为了参与青训营笔记活动,二是方便自己未来查缺补漏。
一、本堂课重点内容
-
高质量编程
- 高质量编程简介
- 编码规范
- 性能优化建议
-
性能调优实战
二、详细知识点回顾
2.1 高质量编程
高质量编程简介
什么是高质量:正确可靠、简洁清晰的代码
1.各种边界条件考虑完备
2.处理异常状态,保证稳定性
3.易读易维护
编码原则
1.简单性:逻辑简单清晰
2.可读性:代码是写给人看的,函数和变量的取名能让人一眼看出其用法或功能
3.生产力:一致的编码风格,保证团队工作效率
编码规范
代码格式
使用goformat将代码格式化为官方统一风格
注释
注释应该解释代码作用
注释应该解释代码的实现过程
注释应该解释代码实现的原因
注释应该解释代码什么情况下会出错
命名规范
-
变量
简洁; 缩略词首字母大写,如果该变量不需要导出,使用全小写; 变量的使用与其定义的地方相距过远,则使用时需要使用更多的上下文信息 -
函数
函数名不需要携带包名信息; 函数名尽量简短; 当包名和函数返回类型冲突时(比如包名为foo,函数返回类型为Foo),可以省略信息防止产生歧义,两者不产生歧义,可以在函数名中加入类型信息。
package
包名只由小写字母组成,不含大写字母和下划线
简短并包含一定的上下文信息
不要与标准库同名
控制流程
如果有两个if else分支都包含return语句,则第二个控制流程可以去除冗余的else
// bad
if true{
return x
}else{
return y
}
//good
if true{
return x
}
return y
线性原理:处理逻辑尽量走直线,避免复杂的嵌套分支
正常流程的代码应该是沿着屏幕往下走的
故障大部分出现在复杂的条件语句和循环语句中
错误和异常处理
-
简单错误
优先使用errors.New来创建简单错误 如果有格式化的要求,使用fmt.Errorf -
复杂错误
使用Wrap生成error的跟踪链 在fmt.Errorf中使用%w关键字来将一个错误关联到错误链中 -
错误判断
使用error.ls判断一个错误是否为特定的错误 不同于==,该方法可以判断错误链中是否包含特定错误
if errors.Is(err, fs.ErrNotExist)
-
panic
不建议在业务代码中使用panic 调用panic而不用recover会使程序崩溃 如果问题可以解决,尝试用error代替panic -
recover
只能在被defer的函数中使用 只能在当前goroutine中生效 defer的语句是后进先出的
总结:代码规范的核心是降低阅读代码的成本,提高代码的阅读性,帮助他人清晰理解你的代码逻辑。