go vet是一个用于检查Go语言源码中静态错误的简单工具,消灭go vet扫描出的静态错误,有利于提高代码质量和养成良好的编码习惯,常见go vet错误总结如下:
passes lock by value …
不能值传递锁,否则可能导致死锁,如下
func createTest(message chan []byte, lock sync.Mutex){
...
}
应将sync.Mutex改为指针* sync.Mutex
… 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中不要出现不必要的其他字符,比如空格,如下会报错
关于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
panic会显示抛出异常(相当于java中的throw),panic后的代码为dead code
if err != nil {
panic("xxx failed")
return
}
如上所示,panic后一行return为dead code