这是我参与「第五届青训营」伴学笔记创作活动的第3天
前言
本节课主要回答了什么是高质量编程和如何进行高质量编程两个问题。
什么是高质量编程
要想进行高质量编程就要明白什么是高质量编程。简单来说,高质量编程就是指编写的代码能够满足健壮性、可读性、简单性等要求。
- 健壮性:编写的代码能够考虑到各种边界条件,能够正确处理各种错误。对于各种情况,均有合适的处理策略。
- 可读性:编写的代码要便于阅读,在后期维护的时候便于维护人员清楚的明白代码具体的操作。注释、文档要清楚简洁。
- 简单性:保证一个函数只处理一件事,一个模块只处理一个功能相关的事,目录层级要清楚,函数命名要规范。
以上这些关于高质量代码的规范不只是适用于Go,他同时适用于各种编程语言和各项工程,也是一个开发人员的必备品质。
编码规范
不同的语言有着不同的编码规范。对于Go来说,官方甚至制定了代码格式来提高代码的编程质量。在安装IDE的时候,会推荐安装gofmt——官方的代码格式化工具,在运行代码时会自动格式化代码。 要想编写高质量的代码,须知:
- 格式:使用gofmt
- 注释:介绍代码的作用、实现原理,对于错误要解释错误原因,对于流控要介绍控制的原因和条件
- 命名:大小驼峰命名法。对于导出变量和函数来说,采用大驼峰,其余变量采用小驼峰。
- 流控:避免嵌套,尽量化简
- 异常处理:简单错误使用error.New(),过程错误使用fmt.Errorf(),判定使用error.Is(),error.As(),程序无法启动使用panic()。尽量将错误原因展示清楚,便于追踪和Bug修复。
性能优化
依照上面的编码规范进行编码后的代码,可能质量过关但是性能可能无法满足实际需要。这就需要我们采用benchmark的手段进行评优,也就是对代码跑分。根据跑分的结果来确定具体优化的方向。
这里以爬楼梯为例。
// 原函数
// ClimbStairs1 使用递归的方式求解爬楼梯
func ClimbStairs1(n int) {
if n < 2 {
return n
}
return ClimbStairs1(n - 1) + ClimbStairs1(n - 2)
}
// ClimbStairs2 使用动态规划的方式求解爬楼梯
func ClimbStairs2(n int) {
if n < 2 {
return n
}
a, b := 0, 1
for i := 0; i < n; i++ {
a, b = b, a + b
}
return b
}
// 测试函数
func BenchmarkClimbStairs1(b *testing.B) {
for n := 0; n < b.N; n++ {
ClimbStairs1(10)
}
}
func BenchmarkClimbStairs2(b *testing.B) {
for n := 0; n < b.N; n++ {
ClimbStairs2(10)
}
}
通过go test -bench=. -benchmen来进行测试,结果如下:
从结果来看,使用动态规划的方法运行更快。这也就是benchmark的意义。
其他的优化方法还有预分配内存,使用函数代替操作符、使用空结构体等等。
性能调优案例
简介:
介绍实际业务服务性能优化的案例;
对逻辑相对复杂的程序如何进行性能调优;
主要分为以下三个方面:
- 业务服务优化
- 基础库优化
- Go语言优化
在优化的过程中,需要建立评估手段,分析数据、重点改造和验证。