这是我参与「第五届青训营」伴学笔记创作活动的第6天
课程导学链接
【Go 语言原理与实践学习资料(上)】第三届字节跳动青训营-后端专场 - 掘金
课程项目地址
wolfogre/go-pprof-practice: go pprof practice. (github.com) 课程PPT
高质量编程与性能调优实战.pptx - 飞书云文档 (feishu.cn) 课程主要分为两个部分,分别是高质量编程和性能调优实战。其中高质量编程多是一些指导性原则,辅以一些示例进行讲解,加上课程PPT以及导学链接中已经总结得很清晰完善,所以本篇笔记仅将其中总结性内容以及个人不太熟悉的点列出,不详细讲解每一个细节。
这节课程承接前两节Go语言基础和Go语言工程实践,可以看出青训营培训的体系性还是很不错的,课程内容也非常充实,每节课PPT都有80-100页,很多知识点课上无法详细讲解。推荐大家按照自身学习状态结合推荐链接以及一些高质量学习资源进行自学,相关实践项目多动手。
高质量编程
什么是高质量代码
- 代码能够达到正确可靠、简洁清晰的目标。
- 各种边界条件是否考虑完善。
- 异常处理情况、稳定性。
- 可读性和可维护性强。
遵循原则
尽管各语言语法不同,但高质量编程所遵循的原则是相通的。
- 简单性:消除多余的复杂性,以简单清晰的逻辑写代码,不理解的代码无法修复改进。
- 可读性:机器识别的是二进制码,代码是给人看的,编写可维护的代码首先保证代码可读。
- 生产力:团队整体的工作效率非常重要。
编码规范
- 代码格式
- 注释
- 命名规范
- 控制流程
- 错误和异常处理
代码格式
-
go的代码格式推荐使用官方提供的gofmt工具自动将格式化为官方统一风格,常见的IDE都支持配置。
-
也可以使用gomports工具,等于gofmt加上依赖包管理,自动增删依赖包引用,将依赖包按字母排序并分类。
-
控制流程
- 线性原理,处理逻辑尽量走直线,避免复杂的嵌套分支
- 正常流程代码沿着屏幕向下移动
- 提升代码可维护性和可读性
- 故障问题多出在复杂的循环语句和条件语句中
-
错误和异常处理
- error尽可能提供简明的上下文信息链,方便定位问题
- panic用于真正异常的情况
- recover生效范围,在当前goroutine的被defer函数中生效
性能优化建议
- 使用Benchmark来衡量性能表现
- Slice预分配内存以减少内存申请,提高运行速度
- Slice使用copy替代re-slice来减少内存占用,节省内存空间
- Map预分配内存
- 字符串处理使用strings.Builder
- 空结构体节约内存,利用其语义特征,同时不耗费资源(利用map实现set)
- atomic包原子化操作提高性能
上面提到的许多建议在这本Go语言高性能编程中都有所涉及,感兴趣可以仔细阅读。
性能调优实战
性能调优原则
-
要依靠数据不是猜测
-
要定位最大瓶颈而不是细枝末节
-
不要过早和过度优化