高质量编程简介 & 性能优化简介 | 青训营笔记

100 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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)