这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
今日学习课程
高质量编程简介及编码规范 - 掘金 (juejin.cn)
高质量编程
- 各种边界条件的考虑
- 异常情况的处理以及稳定性考虑
- 代码易读易维护
简单性、可读性、生产力(效率)
碎碎念:代码可读性是真的很重要啊,不然感觉就是一坨shi😢
有时候刷的算法题过几天就看不懂了
代码格式
代码格式最好统一
推荐使用gofmt自动格式化代码
例子(节选自CodeReviewComments):
When declaring an empty slice, prefer
var t []string
over
t := []string{}
注释
- 解释代码作用
- 解释代码是如何做到的
- 解释代码实现的原因
- 解释代码什么时候会出错
注释应当提供代码未表达出的上下文信息
我好像一般只写代码的作用🥲 反思反思
命名规范
简洁清晰,降低阅读和理解代码的成本
控制流程
例如:避免嵌套,保持正常流程清晰
// Bad
if true {
return x
} else {
return nil
}
//Good
if true {
return x
}
return nil
尽量保持正常代码路径为最小缩进,即优先处理错误情况,尽早返回或继续循环来减少嵌套
错误和异常处理
- 使用
errors.New来创建匿名变量来直接表示简单错误(只出现过一次的错误) - 使用
fmt.Errorf格式化 - 不建议使用
panic recover只能在被defer的函数中使用
性能优化
Go预压提供了支持基准性能测试的benchmark工具
slice预分配内存
尽可能使用make()初始化时提供容量信息
因为切片本质是一个数组片段的描述,包括数组指针、片段长度、片段容量
map预分配内存
使用strings.Builder
进行字符串拼接操作而不是"+"
与Java中类似
空结构体
可以使用空结构体作为各种场景下的占位符
节省内存
atomic包
用于并发场景,性能优于加锁
- 锁的实现是通过操作系统来实现,属于系统调用,atomic 操作是通过硬件实现的,效率比锁高很多
性能分析工具pprof
虽然今天看了相关的课程,但是感觉我的Go语言还没有学到需要进行代码调优或者性能优化的程度,今天的笔记就当作小小的科普吧🤣
其他参考资料
CodeReviewComments · golang/go Wiki (github.com)
uber-go/guide: The Uber Go Style Guide. (github.com)
【后端专场 学习资料一】第五届字节跳动青训营 - 掘金 (juejin.cn)