go vet în Go

Analizează codul și semnalează greșeli probabile pe care compilatorul le acceptă: formate Printf greșite, copieri de mutex etc.

Sintaxă
go vet ./...
go vet ./pachet
go vet -printf=false ./...

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 vet pentru 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.