高质量编程笔记总结 | 青训营

49 阅读2分钟

高质量的编程不仅仅意味着代码可以工作,它还应该是可读的、可维护的,并且符合一定的标准。Go语言为此提供了一套独特的工具和规范,帮助开发者编写出高质量的代码。Go语言的设计哲学是“少即是多”。其编码规范和工具为我们提供了一个简单而强大的框架,使我们能够集中精力编写高效、可读和可维护的代码。

编码规范
编码规范是确保团队内代码一致性的关键。

注释
每一个导出的函数、变量或者结构体都应该有注释。

// Counter counts things.
var Counter int

gofmt的自动格式化工具
使用 gofmt 工具自动格式化代码以保持代码风格的一致性。

gofmt -s -w main.go

函数和变量命名规范
遵循 CamelCase 命名约定。

func CalculateTotalAmount() int {
    var internalCounter int
    //...
}

包命名规范

  • 包名应该是小写的。
  • 避免使用无意义的包名如 util
  • 包名应与目录名匹配。

控制流程

  • 尽量避免使用深层嵌套,考虑重构或者使用 guard clause
  • 使用短路逻辑来简化表达式。
  • 最常见的正常流程的路径被嵌套在两个条件内。成功的出口条件是 return nil,必须仔细匹配大括号来发现。函数最后一行返回一个错误,需要追溯到匹配的左括号,才能了解何时会触发错误。如果后续正常流程需要增加一步操作,调用新的函数,则又会增加一层嵌套。
if someCondition {
    return
}
// More logic here...

错误和异常处理
Go鼓励明确地处理错误,而不是依赖于异常。

简单处理:

file, err := os.Open("filename.txt")
if err != nil {
    log.Fatalf("failed opening file: %s", err)
}
defer file.Close()

错误的Wrap与Unwrap
在Go中,我们经常使用第三方库如pkg/errors来更加清晰地处理错误。Wrap提供了上下文到原始错误,使其更容易追踪问题的来源。

err := someFunction()
if err != nil {
    return errors.Wrap(err, "here is some more context")
}

为了追溯这些嵌套的错误,我们可以使用Unwrap或者Cause

cause := errors.Cause(err)
fmt.Println(cause)

通过这种方式,我们可以构建一个追溯链来追溯错误的源头,每次错误被Wrap时,都会添加新的上下文,使错误的追溯更为清晰。

总结
高质量的代码是团队合作的基石。Go语言提供的工具和编码规范确保了我们能够生产高质量的、一致的代码。作为开发者,我们的责任是理解、采纳并执行这些最佳实践,确保我们的代码既健壮又易于他人理解。