go vet是一個(gè)用于檢查Go語言源碼中靜態(tài)錯(cuò)誤的簡(jiǎn)單工具蝌以,消滅go vet掃描出的靜態(tài)錯(cuò)誤蝉揍,有利于提高代碼質(zhì)量和養(yǎng)成良好的編碼習(xí)慣窘行,常見go vet錯(cuò)誤總結(jié)如下:
-
passes lock by value …
不能值傳遞鎖莹捡,否則可能導(dǎo)致死鎖怕犁,如下
func createTest(message chan []byte, lock sync.Mutex){
...
}
應(yīng)將sync.Mutex改為指針* sync.Mutex
-
… not compatible with reflect.StructTag.Get
- omitempty表示在打印時(shí)若該項(xiàng)為empty則不打印电禀,應(yīng)將其放在雙引號(hào)內(nèi)幢码,如下
type Parameters struct {
Unit int `json:"test_unit"`
MaxInstance int `json:"max_instance",omitempty`
MinInstance int `json:"min_instance",omitempty`
}
應(yīng)改為json:"max_instance,omitempty"
- tag盡量要成pair出現(xiàn),如下會(huì)被掃描
type LoggerConfig struct {
Level string "level"
File string "file"
}
在不影響功能的前提下建議將tag改為pair形式,如:
Level string `json:"level"`
- tag中不要出現(xiàn)不必要的其他字符尖飞,比如空格症副,如下會(huì)報(bào)錯(cuò)
-
關(guān)于print
- fmt.Println() 這種會(huì)自動(dòng)格式化的函數(shù)不要指定輸出格式,如 %s政基,如下贞铣,會(huì)報(bào)錯(cuò):
fmt.Println("write failed! %v", err)
- fmt.Errorf() 這種fmt.xxxf型需要指定輸出格式的,請(qǐng)手動(dòng)指定腋么,如%v咕娄,如下,會(huì)報(bào)錯(cuò)
return fmt.Errorf("write failed! ", err)
- result of fmt.Errorf call not used
fmt.Errorf()不會(huì)打印信息珊擂,只是格式化構(gòu)造出一個(gè)error圣勒,如果想打印日志,請(qǐng)使用logger
fmt.Errorf("write failed: %v ", err)
return
-
panic會(huì)顯示拋出異常(相當(dāng)于java中的throw)摧扇,panic后的代碼為dead code
if err != nil {
panic("xxx failed")
return
}
如上所示圣贸,panic后一行return為dead code