Go高质量编程课程学习 | 青训营

50 阅读2分钟

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)
                  }
            }
        }  
        

    errors.Is()和errors.As()方法提供了对包装错误(或者说是一个错误链)处理的方法,errors.Is()能判断错误链中是否包含特定错误,而errors.AS()能够判断错误链中是否有指定的错误类型(例如自定义错误),并提取出来赋值。

按照以上编程原则和编码规范,我们可以编写出高质量的Go代码,提高团队的工作效率和代码的可读性以及可维护性。