go generate în Go

Rulează comenzile scrise în comentarii //go:generate, de obicei pentru a genera cod Go automat.

Sintaxă
//go:generate comanda argumente    // în fișierul .go

go generate ./...
go generate -x ./...
go generate -run stringer ./...

Ce face go generate

go generate caută în fișierele .go comentariile de forma //go:generate comanda (fără spațiu după //) și execută comenzile, în directorul pachetului. Se folosește pentru cod generat: metode String() cu stringer, cod din fișiere .proto, date incluse, interogări SQL tipizate.

Comanda nu rulează automat la go build sau go test: o pornești tu când s-au schimbat sursele, iar fișierele generate se pun în git, ca proiectul să se compileze fără uneltele de generare. Fișierele generate încep, prin convenție, cu un comentariu // Code generated ... DO NOT EDIT. (sau echivalentul lui). În comenzi sunt disponibile variabile ca $GOFILE și $GOPACKAGE.

Parametri

Parametru Descriere
-x Afișează comenzile pe măsură ce le execută.
-n Doar afișează comenzile, fără să le execute.
-run regex Rulează doar directivele potrivite.

Exemple

Exemplul 1: Generare cu un program din proiect

tools/gencurs este un program Go mic care scrie fișierul curs_generat.go.

// preturi/gen.go
package preturi

//go:generate go run ../tools/gencurs -o curs_generat.go

// în terminal:
// go generate -x ./...
// cat preturi/curs_generat.go

Rezultat în terminal

go run ../tools/gencurs -o curs_generat.go
gencurs: am scris curs_generat.go
// Cod generat de gencurs. NU MODIFICA.

package preturi

const CursEUR = 4.97

Exemplul 2: stringer pentru constante

Necesită stringer instalat cu go install golang.org/x/tools/cmd/stringer@latest.

// stare.go
package comenzi

//go:generate stringer -type=Stare

type Stare int

const (
    InAsteptare Stare = iota
    Trimisa
    Livrata
)

// în terminal:
// go generate ./...
// ls

Rezultat în terminal

stare.go	stare_string.go

Greșeli frecvente

  • // go:generate cu spațiu: nu este recunoscut; trebuie scris lipit //go:generate.
  • Așteptarea ca go build să ruleze generarea: trebuie rulat explicit go generate.
  • Modificarea manuală a fișierelor generate: se pierd la următoarea generare.

Comenzi înrudite

  • go install: Compilează un program și pune executabilul în directorul bin (GOBIN sau GOPATH/bin), ca să-l poți rula de oriunde.
  • go build: Compilează pachetele și, pentru pachetul main, creează un executabil de sine stătător.
  • iota: Contor folosit în blocurile const: pornește de la 0 și crește cu 1 la fiecare rând; ideal pentru enumerări.