Go Vet 常见warning总结

go vet是一个用于检查Go语言源码中静态错误的简单工具,消灭go vet扫描出的静态错误,有利于提高代码质量和养成良好的编码习惯,常见go vet错误总结如下:

  1. passes lock by value …

不能传递锁,否则可能导致死锁,如下

func createTest(message chan []byte, lock sync.Mutex){
    ...
}

应将sync.Mutex改为指针* sync.Mutex

  1. … not compatible with reflect.StructTag.Get
  • omitempty表示在打印时若该项为empty则不打印,应将其放在双引号内,如下
type Parameters struct {
    Unit        int `json:"test_unit"`
    MaxInstance int `json:"max_instance",omitempty`
    MinInstance int `json:"min_instance",omitempty`
}

应改为json:"max_instance,omitempty"

  • tag尽量要成pair出现,如下会被扫描
type LoggerConfig struct {
    Level string "level"
    File  string "file"
}

在不影响功能的前提下建议将tag改为pair形式,如:

Level string `json:"level"`
  • tag中不要出现不必要的其他字符,比如空格,如下会报错
  1. 关于print
  • fmt.Println() 这种会自动格式化的函数不要指定输出格式,如 %s,如下,会报错:
    fmt.Println("write failed! %v", err)
  • fmt.Errorf() 这种fmt.xxxf型需要指定输出格式的,请手动指定,如%v,如下,会报错
    return fmt.Errorf("write failed! ", err)
  • result of fmt.Errorf call not used
    fmt.Errorf()不会打印信息,只是格式化构造出一个error,如果想打印日志,请使用logger
    fmt.Errorf("write failed: %v ", err)
    return 
  1. panic会显示抛出异常(相当于java中的throw),panic后的代码为dead code
    if err != nil {
        panic("xxx failed")
        return
    }

如上所示,panic后一行return为dead code

你可能感兴趣的:(Go Vet 常见warning总结)