看完了张雷老师的《Go语言高质量编程简介以及编码规范》视频,有一些点感觉很有收获,在此发个文章记录一下。
panic 和 recover
在Go中,panic 和 recover是异常处理的机制。当程序出现无法逆转的错误时,使用panic。在处理真正异常的情况时,也使用panic。在其他情况下,使用error。尽早暴露错误,以便尽早解决它们。在使用recover时要注意它的范围和限制条件。
defer语句是后进先出的机制,在函数返回之前调用。recover用于记录panic的上下文信息,以便排查和定位问题。
命名
命名应该简洁明了,避免使用缩写。函数名称应该以函数的功能命名,包括参数和返回值的类型。避免使用单字符名称。避免使用混淆的名称。
单元测试
单元测试应该是幂等的,即多次运行结果应该相同。在测试中使用t.Helper()可以将错误定位到调用方。在测试中使用t.Run()可以方便地组合测试用例。
错误处理
错误处理应该在代码中明确处理,而不是忽略错误。错误应该在函数的顶部定义,以便于查看。使用errors.New()或fmt.Errorf()创建错误。避免在循环中使用defer。
接口设计
接口应该是精简的,只包含必要的方法。对于单个实现的接口,可以在实现的包的顶部定义接口。对于多个实现的接口,可以在独立的包中定义接口。
并发
在Go中,goroutine是并发编程的基本单位。避免使用共享变量。避免死锁。优先使用sync.Mutex。使用sync.RWMutex时要注意锁定的粒度。
函数
函数应该短小精悍,只做一件事情。函数参数应该避免使用bool类型。避免使用全局变量。
结构体
结构体应该是不可变的。避免使用指针类型的结构体。避免使用struct{}作为空结构体。
数组和切片
切片应该是可变的。避免在循环中使用append。避免在循环中使用切片。
map
map应该使用make()初始化。在使用delete()时要注意判断键是否存在。
defer
defer语句应该在函数内部定义。defer语句应该在函数返回之前调用。
总结
本文总结了一些Go编码规范的最佳实践,包括panic和recover、命名、单元测试、错误处理、接口设计、并发、函数、结构体、数组和切片、map和defer等方面的内容。这些规范可以帮助开发人员写出更加健壮、可维护和可扩展的代码,从而提高代码质量和开发效率。