go generate & stringer
go generate orquesta generadores de código.
Busca en todas las páginas de la documentación
go generate orquesta generadores de código.
stringer es el generador de "hola mundo": las constantes tipadas obtienen un método String() correcto sin reflexión.
Coloca comentarios //go:generate encima de funciones o tipos en cualquier archivo .go.
Ejecuta go generate ./... desde la raíz del módulo para ejecutar esos comandos.
stringer emite un archivo *_string.go con String() para enums basados en int.
Los equipos confirman la salida generada y vuelven a ejecutar los generadores cuando cambian los tipos.
Flujo de trabajo de generación de referencia rápida.
//go:generate stringer -type=Status -trimprefix=Status
type Status int
const (
StatusPending Status = iota
StatusActive
StatusDone
)go install golang.org/x/tools/cmd/stringer@latest
go generate ./...
go test ./...Cuándo usar esto:
String() en tiempo de compilación sin mantener manualmente sentencias switchgo generate (mockgen, protobuf, stringer)Mini-módulo completo con salida de stringer verificada.
// status.go
package job
//go:generate stringer -type=Status -trimprefix=Status
type Status int
const (
StatusPending Status = iota
StatusRunning
StatusFailed
StatusSucceeded
)
func (s Status) IsTerminal() bool {
return s == StatusFailed || s == StatusSucceeded
}Después de go generate:
// status_string.go (generado)
package job
import "strconv"
func _() {
_ = x[StatusPending-0]
}
const _Status_name = "PendingRunningFailedSucceeded"
var _Status_index = [...]uint8{0, 7, 14, 20, 29}
func (i Status) String() string {
if i < 0 || i >= Status(len(_Status_index)-1) {
return "Status(" + strconv.FormatInt(int64(i), 10) + ")"
}
return _Status_name[_Status_index[i]:_Status_index[i+1]]
}// job_test.go
package job
import "testing"
func TestStatusString(t *testing.T) {
if StatusRunning.String() != "Running" {
t.Fatal(StatusRunning.String())
}
}Lo que esto demuestra:
-trimprefix elimina el prefijo redundante Status de la salida de cadenaDO NOT EDIT (stringer la añade)Status(99).go en busca de líneas que comiencen con //go:generate$GOFILE y $GOPACKAGE establecidos en el archivo contenedor| Herramienta | Ejemplo de directiva | Salida |
|---|---|---|
| stringer | //go:generate stringer -type=T | t_string.go |
| mockgen | //go:generate mockgen -source=iface.go | mock_iface.go |
| protobuf | //go:generate protoc --go_out=. api.proto | api.pb.go |
| enumer | ayudantes de enum de terceros | personalizado |
go generate ./...
git diff --exit-code || (echo "ejecuta go generate y confirma"; exit 1)// Mantén los generadores en el módulo de herramientas o tools.go con la etiqueta de compilación
//go:build tools
package tools
import _ "golang.org/x/tools/cmd/stringer"-type. Solución: Líneas //go:generate separadas por tipo.golang.org/x/tools en tools.go para una CI reproducible. Solución: go install en la versión del módulo fijada en CI.| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
String() escrito a mano | Uno o dos constantes | Enums grandes que cambian a menudo |
fmt.Sprintf("%d") | Solo para depuración | Logs y APIs necesitan nombres |
| iota + map | Enums diminutos sin herramientas | Ya usas stringer en otros lugares |
| enums de protobuf | Servicios gRPC | Tipos de dominio Go simples |
No.
Invocalo explícitamente en CI o scripts locales.
La mayoría de los proyectos Go sí, para que los consumidores compilen sin herramientas generadoras.
Documenta el comando de regeneración en README o CONTRIBUTING.
Elimina un prefijo de los nombres de constantes en la cadena generada.
StatusRunning se convierte en "Running" con -trimprefix=Status.
Sí: stringer -type=Foo,Bar o múltiples directivas.
Cualquier archivo .go en el paquete, comúnmente junto a la definición del tipo.
Usa un tools.go con la etiqueta de compilación tools e instala esa versión del módulo en CI.
Corrige el comando del generador, plugins de protoc faltantes o PATH.
Registra $GOFILE para la directiva fallida.
No.
Es un generador de código en tiempo de compilación que usa go/types.
Sí.
Propósitos diferentes: generate crea archivos; fix moderniza los sitios de llamada.
Ejecuta ambos en ramas de actualización.
Prueba de tabla con constantes conocidas y un valor fuera de rango.
Versiones de Stack: Esta página fue escrita para Go 1.26.x (predeterminado GC de Green Tea, modernizadores de go fix - verifica el parche en la compilación), chi (última - verifica en la compilación), gin (última - verifica en la compilación), echo (última - verifica en la compilación), google.golang.org/grpc (última - verifica en la compilación), sigs.k8s.io/controller-runtime (última - verifica en la compilación), kubebuilder (última - verifica en la compilación), tinygo (última - verifica objetivos de placa en la compilación), wazero (última - verifica en la compilación), y golangci-lint (última - verifica el conjunto de linters en la compilación).
Revisado por Chris St. John·Última actualización: 19 jul 2026