Go高质量编程
编程原则
- 简单性
1.消除复杂的逻辑,以简单清晰的逻辑编写代码
2.不理解的代码难以修复改进 - 可读性
1.维护代码第一步是代码可读 - 生产力
1.团队整体工作效率很重要
编码规范
-
代码格式
1.gofmt工具自动将代码格式化成Go官方统一风格
2.goimports格式化+依赖包管理 -
注释(解释作用,解释代码如何做,代码实现原因,代码何时出错)
1.对包中的公共符号必须有注释(如公共变量,函数等)
2.不需要对实现接口的方法进行注释
3.注释应该表达代码表达的上下文信息 -
命名规范
- 变量
1.缩略词均大写,若位于开头且不需要导出则采用全小写
2.变量距其调用处越远,则需要带有越多的上下文信息 - 函数
1.函数名不带包名的上下文信息,且尽量简短
2.函数返回类型与包名一致时,函数名可省略其返回类型 - 包名
1.简短并只由小写字母组成
2.不与标准库同名
3.尽量使用单数而不是复数,同样不使用常用变量名**
4.谨慎使用缩写
- 变量
-
控制流程
1.编写优雅和简洁的控制流程,避免使用过多的嵌套和复杂的逻辑。 2.一般情况下,优先处理特殊的错误情况,减少过多分支嵌套。 -
错误和异常处理
良好的错误和异常处理能够提高代码的健壮性和鲁棒性。使用Go提供的错误处理机制,如返回错误类型,在关键位置进行错误检查和处理。- go的错误处理包errors
- error.Is()
package main import ( "errors" "fmt" "io/fs" "os" ) func main() { if _, err := os.Open("non-existing"); err != nil { if errors.Is(err, fs.ErrNotExist) { fmt.Println("file does not exist") } else { fmt.Println(err) } } } - errors.As()
package main import ( "errors" "fmt" "io/fs" "os" ) func main() { if _, err := os.Open("non-existing"); err != nil { var pathError *fs.PathError if errors.As(err, &pathError) { fmt.Println("Failed at path:", pathError.Path) } else { fmt.Println(err) } } }
- error.Is()
errors.Is()和errors.As()方法提供了对包装错误(或者说是一个错误链)处理的方法,errors.Is()能判断错误链中是否包含特定错误,而errors.AS()能够判断错误链中是否有指定的错误类型(例如自定义错误),并提取出来赋值。
- go的错误处理包errors