Paquete flag y Flags Estilo POSIX
El paquete flag de la biblioteca estándar de Go analiza opciones de línea de comandos sin dependencias de terceros.
Busca en todas las páginas de la documentación
El paquete flag de la biblioteca estándar de Go analiza opciones de línea de comandos sin dependencias de terceros.
Admite tipos booleanos, de cadena, enteros, de duración y flag.Value personalizados, con -nombre=valor estilo POSIX y flags cortas booleanas agrupadas.
Para herramientas de comandos múltiples, instancias flag.FlagSet dedicadas evitan que los flags de subcomandos choquen.
flag registra variables antes de Parse, luego las modifica a partir de os.Args.
El conjunto predeterminado es flag.CommandLine; las CLIs de producción a menudo usan flag.NewFlagSet por subcomando.
El texto de uso, el manejo de errores y la salida de ayuda son personalizables para que los scripts y los humanos obtengan un comportamiento predecible.
Tarjeta de receta de referencia rápida, lista para copiar y pegar.
fs := flag.NewFlagSet("deploy", flag.ExitOnError)
fs.Usage = func() {
fmt.Fprintf(os.Stderr, "uso: mytool deploy [flags] <env>\n")
fs.PrintDefaults()
}
timeout := fs.Duration("timeout", 30*time.Second, "tiempo de espera de la operación")
_ = fs.Parse(os.Args[2:])Cuándo usar esto:
switch en os.Args[1].package main
import (
"flag"
"fmt"
"os"
"time"
)
type mode string
func (m *mode) Set(s string) error {
switch s {
case "dry", "apply":
*m = mode(s)
return nil
default:
return fmt.Errorf("el modo debe ser dry o apply")
}
}
func (m *mode) String() string { return string(*m) }
func main() {
fs := flag.NewFlagSet("run", flag.ExitOnError)
var m mode
fs.Var(&m, "mode", "dry o apply")
verbose := fs.Bool("v", false, "registro detallado")
timeout := fs.Duration("timeout", 10*time.Second, "espera máxima")
fs.Usage = func() {
fmt.Fprintf(os.Stderr, "uso: %s run [flags]\n", os.Args[0])
fs.PrintDefaults()
}
if err := fs.Parse(os.Args[1:]); err != nil {
os.Exit(2)
}
fmt.Printf("mode=%s verbose=%v timeout=%s args=%v\n", m, *verbose, *timeout, fs.Args())
}Lo que esto demuestra:
flag.Value con Set y String.fs.Var registra enumeraciones con validación en Set.Duration analizan cadenas de duración de Go (300ms, 2m).String, Bool, Int, Var) guarda metadatos en un FlagSet.Parse recorre los argumentos: los flags comienzan con -; el primer token que no es un flag finaliza el análisis de flags a menos que FlagSet lo indique de otra manera.-v, -v=true y -v=false.Args() devuelve los tokens posicionales restantes.| Forma | Ejemplo | Notas |
|---|---|---|
| Largo con valor | -timeout=30s | Preferido para scripts |
| Largo separado por espacio | -timeout 30s | Compatible con flags no booleanos |
| Booleano corto | -v | Establece true |
| Cola posicional | file.txt | Disponible a través de Args() |
| Flag desconocido | -zzz | Activa Usage y luego sale (conjunto predeterminado) |
| Modo | Comportamiento |
|---|---|
flag.ExitOnError | Imprime error + uso, os.Exit(2) |
flag.ContinueOnError | Devuelve el error de análisis al llamador |
flag.PanicOnError | Entra en pánico ante un error de análisis (raro en aplicaciones) |
// Introspeccionar flags en pruebas
fs.Visit(func(f *flag.Flag) {
t.Log(f.Name, f.Value.String())
})flag.CommandLine en bibliotecas; exporta un Run(args []string) que use un FlagSet privado.--long estilo GNU no es nativo; los usuarios esperan el estilo POSIX de un solo guion a menos que agregues un envoltorio.embed o valores predeterminados de entorno en main, no dentro de paquetes reutilizables.String después de Parse omiten silenciosamente argv. Solución: registra cada flag al inicio antes de Parse.flag.CommandLine global en pruebas - Las pruebas paralelas luchan por el mismo conjunto. Solución: NewFlagSet por caso de prueba.fs.Parse(os.Args[2:]) - El nombre del subcomando se analiza como un valor de flag. Solución: corta los args después del token del subcomando.tool --help | grep mezclados con tuberías de datos. Solución: siempre Fprintf(os.Stderr, ...).| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| cobra / urfave/cli | Muchos subcomandos, completado | Un solo flag -config es suficiente |
| Configuración solo por entorno | Herramientas empaquetadas con entorno inyectado | Los operadores necesitan archivos de anulación locales |
kong / go-flags | Análisis impulsado por tags de struct | Quieres cero dependencias de terceros |
Escaneo manual de os.Args | Scripts diminutos | La validación y el texto de ayuda importan |
No de forma nativa.
Los usuarios pasan -nombre o -nombre=valor.
Bibliotecas como cobra agregan compatibilidad GNU si tu audiencia lo espera.
Verifica después de Parse: si *api == "", llama a Usage y sal.
cobra ofrece MarkFlagRequired para la misma protección.
El FlagSet predeterminado detiene el análisis de flags en el primer argumento que no es un flag.
Usa un framework o un analizador personalizado si necesitas intercalación GNU.
Llama a fs.Parse([]string{"-v", "file"}) en un FlagSet dedicado.
Nunca confíes en flag.Parse global en pruebas paralelas.
ExitOnError usa el código de salida 2 después de imprimir el uso.
Documenta tus propios códigos para fallos de lógica de negocio por separado.
Los valores predeterminados se imprimen usando el método String() del flag.
flag.Duration muestra valores legibles como 10s.
Registra dos flags que apunten a la misma variable, o usa alias de cobra.
La biblioteca estándar no proporciona alias por sí sola.
go test consume sus propios flags.
Ejecuta go test ./... -- -myflag para pasar flags al binario de prueba, o prueba una función de paquete directamente.
Evítalo.
Deja que main se encargue del cableado de la CLI para que los importadores no se sorprendan por efectos secundarios globales.
Cuando necesitas completado de shell, flags padres persistentes o ayuda en markdown generada automáticamente.
Actualiza a cobra o urfave/cli manteniendo el mismo binario main.
Versiones de Stack: Esta página fue escrita para Go 1.26.x (predeterminado Green Tea GC, go fix modernizers - verificar parche en la compilación), chi (última - verificar en la compilación), gin (última - verificar en la compilación), echo (última - verificar en la compilación), google.golang.org/grpc (última - verificar en la compilación), sigs.k8s.io/controller-runtime (última - verificar en la compilación), kubebuilder (última - verificar en la compilación), tinygo (última - verificar objetivos de placa en la compilación), wazero (última - verificar en la compilación) y golangci-lint (última - verificar conjunto de linters en la compilación).
Revisado por Chris St. John·Última actualización: 16 jul 2026