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:generatecu spațiu: nu este recunoscut; trebuie scris lipit//go:generate.- Așteptarea ca
go buildsă ruleze generarea: trebuie rulat explicitgo 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.