Ce face go vet
go vet caută construcții care compilează, dar sunt aproape sigur greșite: un Printf cu mai puține argumente decât verbe %, un Println cu %d în text, un sync.Mutex copiat prin valoare, wg.Add apelat din interiorul goroutinei, tag-uri de struct greșite, cod imposibil de atins după return, conversii string(int) și multe altele.
Iese cu cod nenul dacă găsește ceva, deci se folosește în CI alături de go test (care rulează automat o parte din aceste verificări). Toate exemplele din această secțiune au fost verificate cu go vet înainte de rulare.
Parametri
| Parametru | Descriere |
|---|---|
-nume=false |
Dezactivează o anumită verificare (de exemplu -printf=false). |
Exemple
Exemplul 1: Greșeli de formatare găsite de vet
Codul se compilează fără erori, dar go vet găsește două probleme.
// rau/rau.go
package rau
import "fmt"
func Afiseaza(nume string, varsta int) {
fmt.Printf("%s are %d ani\n", nume)
fmt.Println("vârsta: %d", varsta)
}
// în terminal:
// go vet ./...
Rezultat în terminal
rau/rau.go:6:24: fmt.Printf format %d reads arg #2, but call has 1 arg
rau/rau.go:7:5: fmt.Println call has possible Printf formatting directive %d
Exemplul 2: Probleme de concurență
// main.go
package main
import "sync"
func lucreaza(wg sync.WaitGroup) {}
func main() {
var wg sync.WaitGroup
for range 2 {
go func() {
wg.Add(1)
defer wg.Done()
}()
}
wg.Wait()
lucreaza(wg)
}
// în terminal:
// go vet .
Rezultat în terminal
main.go:5:18: lucreaza passes lock by value: sync.WaitGroup contains sync.noCopy
main.go:16:14: call of lucreaza copies lock value: sync.WaitGroup contains sync.noCopy
main.go:11:19: WaitGroup.Add called from inside new goroutine
Greșeli frecvente
- Ignorarea mesajelor
go vetpentru că „programul compilează”: aproape toate indică bug-uri reale. - Rularea doar pe pachetul curent: folosește
go vet ./...pentru tot modulul.
Comenzi înrudite
go fmt: Formatează automat codul Go în stilul standard (gofmt): indentare, spații, alinieri și ordinea importurilor.go test: Compilează și rulează testele (fișierele _test.go) și raportează ce a trecut și ce a picat.go build: Compilează pachetele și, pentru pachetul main, creează un executabil de sine stătător.