这是我参与「第三届青训营 -后端场」笔记创作活动的第1篇笔记
1.如何编写高质量的go代码
-
gofmt Go语言官方提供的工具,gofmt能自动化Go语言代码为官方统一风格。 -
goimports 相当于gofmt加上依赖包管理,能够自动增加或删除依赖的包引用。 -
编写注释 注释应该解释代码的作用,并且解释代码是如何做的,还应该解释代码实现的原因。 合理的代码注释能够缩短阅读代码的时间,也更易于维护代码。 -
编码规范 代码的逻辑要尽量走直线,要尽量避免复杂的嵌套 逻辑简单清晰的代码,可读性会很高,可维护性也将提高 -
错误处理 应当优先使用errors.New 来直接表示简单错误 如果想要判定一个错误是否为特定错误,可以使用errors.IS -
panic 不建议在业务代码中使用panic,如果panic了,它会导致整个程序崩溃 可用error替代panic
- 性能优化
-
make: slice 尽可能在make时提供具体的容量信息,避免造成多次内存分配,可获得更好的性能。 -
make: map 尽可能提前分配好空间,可减少拷贝的rehash的性能损耗 -
字符串拼接: 在字符串拼接时,避免使用string + string 的方法 应使用strings.Builder来进行字符串拼接,两种方法的实际性能有很大差异。 因为在Go语言中字符串是不可变的,内存占用是固定的, 如果使用+string的方法会造成重新分配内存,造成性能损耗。 而strings.Builder bytes.Buffer底层是byte数组,不需要每次都重新分配内存 -
atomic: 锁和atomic的对比: 锁的实现是通过操作系统来实现, 属于系统调用 atomic操作是通过硬件实现,效率比锁高 sync.mutex 应该用来保护一段逻辑 不仅仅用于保护一个变量
- 性能分析工具pprof
-
pprof: 是分析性能分析数据的可视化工具,可知道代码在什么地方耗费了多少CPU、内存 可通过web网页的方式查看各部分组件的采样数据 alloc 表示内存分配情况 goroutine 表示当前所有goroutine的堆栈信息 block 表示阻塞操作情况 mutex 表示锁竞争情况 trace 是程序运行的跟踪信息