Fundamentos de Herramientas CLI
10 ejemplos para empezar con herramientas de línea de comandos en Go: 7 básicos y 3 intermedios.
Busca en todas las páginas de la documentación
10 ejemplos para empezar con herramientas de línea de comandos en Go: 7 básicos y 3 intermedios.
mkdir clilab && cd clilab && go mod init example.com/clilab.main.go (o archivos separados en un mismo paquete) y ejecútalo con go run ..-- cuando uses go run: go run . -- -name=Ada.El paquete flag de la librería estándar analiza -name antes de que se ejecute la lógica de main.
package main
import (
"flag"
"fmt"
)
func main() {
name := flag.String("name", "world", "objetivo del saludo")
flag.Parse()
fmt.Printf("hola, %s\n", *name)
}flag.String registra un puntero que se actualiza durante flag.Parse().Relacionado: Paquete flag y Flags Estilo POSIX - FlagSet y texto de uso
Mezcla flags Bool, Int y Duration en un mismo comando.
package main
import (
"flag"
"fmt"
"time"
)
func main() {
verbose := flag.Bool("v", false, "salida detallada")
count := flag.Int("n", 1, "número de repeticiones")
delay := flag.Duration("delay", 0, "pausa entre líneas")
flag.Parse()
for i := 0; i < *count; i++ {
if *verbose {
fmt.Println("tick", i)
}
time.Sleep(*delay)
}
}-v y -v=true ambos establecen una flag booleana.flag.Duration acepta 300ms, 2s, 1m.flag.Args() para argumentos posicionales.Relacionado: Diseño CLI en Go: Binario Único, Arranque Rápido - por qué Go es adecuado para CLIs
flag.Args() devuelve los tokens que no fueron consumidos como flags.
package main
import (
"flag"
"fmt"
)
func main() {
flag.Parse()
args := flag.Args()
if len(args) == 0 {
fmt.Println("uso: tool <archivo>...")
return
}
for _, path := range args {
fmt.Println("procesando", path)
}
}Relacionado: Salida en Color y Errores Amigables para el Usuario - mensajes en stderr
Reemplaza el texto de uso predeterminado con ayuda amigable para el operador.
package main
import (
"flag"
"fmt"
"os"
)
func main() {
flag.Usage = func() {
fmt.Fprintf(os.Stderr, "uso: %s [flags] <objetivo>\n", os.Args[0])
flag.PrintDefaults()
}
flag.Parse()
}flag.Usage se ejecuta en errores de análisis y cuando lo llamas manualmente.PrintDefaults lista las flags registradas con sus valores predeterminados.Relacionado: Paquete flag y Flags Estilo POSIX - convenciones de uso
Aísla las flags al despachar en os.Args[1].
package main
import (
"flag"
"fmt"
"os"
)
func main() {
if len(os.Args) < 2 {
fmt.Println("uso: tool <init|run>")
os.Exit(1)
}
switch os.Args[1] {
case "init":
fs := flag.NewFlagSet("init", flag.ExitOnError)
dir := fs.String("dir", ".", "directorio del proyecto")
_ = fs.Parse(os.Args[2:])
fmt.Println("inicializando en", *dir)
case "run":
fmt.Println("ejecutando")
default:
fmt.Println("subcomando desconocido")
os.Exit(1)
}
}flag.NewFlagSet evita colisiones entre flags de subcomandos.os.Args[2:] para que el nombre del subcomando no se vuelva a analizar.flag.ExitOnError sale en caso de flags desconocidas solo para ese subcomando.Relacionado: Árboles de Comandos de cobra y urfave/cli - árboles de comandos estructurados
Las salidas distintas de cero señalan fallos a scripts de shell y CI.
package main
import (
"errors"
"fmt"
"os"
)
func run() error {
return errors.New("configuración faltante")
}
func main() {
if err := run(); err != nil {
fmt.Fprintln(os.Stderr, "error:", err)
os.Exit(1)
}
}os.Exit para main; las funciones diferidas no se ejecutan después de os.Exit.Relacionado: Salida en Color y Errores Amigables para el Usuario - convenciones de códigos de salida
Inyecta metadatos de compilación en tiempo de compilación.
package main
import (
"flag"
"fmt"
)
var version = "dev"
func main() {
showVersion := flag.Bool("version", false, "imprime la versión y sale")
flag.Parse()
if *showVersion {
fmt.Println(version)
return
}
}go build -ldflags "-X main.version=1.0.0".version debe ser un string a nivel de paquete.--version con sellos de CI de etiquetas git.Relacionado: Mejores Prácticas para Herramientas CLI - versionado y distribución
Lee la variable de entorno antes que los valores predeterminados de las flags para la configuración estilo doce factores.
package main
import (
"flag"
"fmt"
"os"
)
func envOr(key, fallback string) string {
if v := os.Getenv(key); v != "" {
return v
}
return fallback
}
func main() {
def := envOr("API_URL", "http://localhost:8080")
api := flag.String("api", def, "URL base de la API")
flag.Parse()
fmt.Println(*api)
}Parse).--help.Relacionado: Configuración: Viper, Env y Archivos de Configuración - configuración en capas
Intercambia el conjunto de flags global en las pruebas para evitar contaminación.
package main
import (
"flag"
"testing"
)
func TestGreetFlag(t *testing.T) {
fs := flag.NewFlagSet("test", flag.ContinueOnError)
name := fs.String("name", "world", "")
err := fs.Parse([]string{"-name", "Ada"})
if err != nil || *name != "Ada" {
t.Fatalf("error de análisis err=%v name=%q", err, *name)
}
}flag.ContinueOnError permite a las pruebas afirmar fallos de análisis.Run del paquete testing que aceptan []string en lugar de globales.SetArgs para el mismo patrón de aislamiento.Relacionado: Mejores Prácticas para Herramientas CLI - pruebas de CLIs
cobra añade generación de ayuda y enrutamiento de subcomandos.
package main
import (
"fmt"
"github.com/spf13/cobra"
)
func main() {
root := &cobra.Command{
Use: "demo",
Short: "CLI de demostración",
RunE: func(cmd *cobra.Command, args []string) error {
fmt.Println("demo ok")
return nil
},
}
if err := root.Execute(); err != nil {
panic(err)
}
}go get github.com/spf13/cobra@latest antes de compilar.RunE devuelve errores; Execute los imprime y establece el código de salida 1.root.AddCommand para herramientas reales.Relacionado: Árboles de Comandos de cobra y urfave/cli - flags persistentes y completado
Versiones de Stack: Esta página fue escrita para Go 1.26.x (GC por defecto Green Tea, modernizadores go fix - verifica el parche en la compilación), chi (última versión - verifica en la compilación), gin (última versión - verifica en la compilación), echo (última versión - verifica en la compilación), google.golang.org/grpc (última versión - verifica en la compilación), sigs.k8s.io/controller-runtime (última versión - verifica en la compilación), kubebuilder (última versión - verifica en la compilación), tinygo (última versión - verifica objetivos de placa en la compilación), wazero (última versión - verifica en la compilación) y golangci-lint (última versión - verifica el conjunto de linters en la compilación).
Revisado por Chris St. John·Última actualización: 18 jul 2026