这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
一、本堂课重点内容:
-
何为高质量?
-
高质量编程规范
- 代码格式
- 注释
- 命名规范
- 控制流程
- 错误和异常处理
-
性能优化建议
- Go自带性能测试工具
Benchmark - Slice
- 字符串处理
- Go自带性能测试工具
二、详细知识点介绍:
-
Slice :
- 预分配内存 : 在使用
make初始化切片时就提供容量信息。若在程序运行过程中对切片进行扩容,扩容过程中拷贝会导致程序运行变慢。 - 大内存释放 : 在原切片(大量数据)上切片(少量数据),虽然只使用了一小段数据,但底层仍占用着大量空间,使用
copy代替切片。
- 预分配内存 : 在使用
-
字符串处理 : 处理字符串时要善用
strings.Builder和bytes.Buffer。 -
Atomic包 : 多线程共用计算器时,
Atomic会比GO自带的锁更快。
三、实践练习例子:
- Slice 预分配内存
- 未预分配内存
func NoPreAlloc(size int) {
data := make([]int, 0)
for k := 0; k < size; k++ {
data = append(data, k)
}
}
- 预分配内存
func PreAlloc(size int) {
data := make([]int, 0, size)
for k := 0; k < size; k++ {
data = append(data, k)
}
}
- 大内存释放
// GetLastBySlice 通过切片返回,未释放origin占用的内存
func GetLastBySlice(origin []int) []int {
return origin[len(origin)-2:]
}
// GetLastByCopy 通过copy返回,origin占用的内存若无引用则会被释放
func GetLastByCopy(origin []int) []int {
result := make([]int, 2)
copy(result, origin[len(origin)-2:])
return result
}
四、课后个人总结:
- 在编写代码过程中要注意代码编写规范,例如包名中包含的信息,在方法名中就没有必要去二次说明。
- 要去从底层考虑代码,如在初始化切片时去提供容量信息,进行预分配内存。
- 字符串处理时,要学会使用
strings.Builder和bytes.Buffer。 - 在遇到错误时,慎用panic,除非发生了不可逆转的错误。