Go by Example: Command-Line Flags

Flags de línea de comandos son una forma común de especificar opciones para programas de línea de comandos. Por ejemplo, en wc -l el -l es un flag de línea de comandos.

package main

Go proporciona un paquete flag que soporta el análisis básico de flags de línea de comandos. Utilizaremos este paquete para implementar nuestro programa de ejemplo de línea de comandos.

import (
    "flag"
    "fmt"
)
func main() {

Las declaraciones básicas de flags están disponibles para opciones de tipo string, entero y booleano. Aquí declaramos un flag de tipo string word con un valor por defecto "foo" y una breve descripción. Esta función flag.String devuelve un puntero a string (no un valor de string); veremos cómo usar este puntero más adelante.

    wordPtr := flag.String("word", "foo", "a string")

Esto declara los flags numb y fork, utilizando un enfoque similar al flag word.

    numbPtr := flag.Int("numb", 42, "an int")
    forkPtr := flag.Bool("fork", false, "a bool")

También es posible declarar una opción que utiliza una var existente declarada en otro lugar del programa. Ten en cuenta que necesitamos pasar un puntero a la función de declaración del flag.

    var svar string
    flag.StringVar(&svar, "svar", "bar", "a string var")

Una vez que todos los flags están declarados, llama a flag.Parse() para ejecutar el análisis de la línea de comandos.

    flag.Parse()

Aquí simplemente mostraremos las opciones analizadas y cualquier argumento posicional restante. Ten en cuenta que necesitamos desreferenciar los punteros con, por ejemplo, *wordPtr para obtener los valores reales de las opciones.

    fmt.Println("word:", *wordPtr)
    fmt.Println("numb:", *numbPtr)
    fmt.Println("fork:", *forkPtr)
    fmt.Println("svar:", svar)
    fmt.Println("tail:", flag.Args())
}

Para experimentar con el programa de flags de línea de comandos es mejor primero compilarlo y luego ejecutar el binario resultante directamente.

$ go build command-line-flags.go

Prueba el programa construido dándole primero valores para todos los flags.

$ ./command-line-flags -word=opt -numb=7 -fork -svar=flag
word: opt
numb: 7
fork: true
svar: flag
tail: []

Ten en cuenta que si omites flags, automáticamente toman sus valores por defecto.

$ ./command-line-flags -word=opt
word: opt
numb: 42
fork: false
svar: bar
tail: []

Los argumentos posicionales restantes se pueden proporcionar después de cualquier flag.

$ ./command-line-flags -word=opt a1 a2 a3
word: opt
...
tail: [a1 a2 a3]

Ten en cuenta que el paquete flag requiere que todos los flags aparezcan antes de los argumentos posicionales (de lo contrario, los flags serán interpretados como argumentos posicionales).

$ ./command-line-flags -word=opt a1 a2 a3 -numb=7
word: opt
numb: 42
fork: false
svar: bar
tail: [a1 a2 a3 -numb=7]

Usa los flags -h o --help para obtener texto de ayuda generado automáticamente para el programa de línea de comandos.

$ ./command-line-flags -h
Usage of ./command-line-flags:
  -fork=false: a bool
  -numb=42: an int
  -svar="bar": a string var
  -word="foo": a string

Si proporcionas un flag que no fue especificado al paquete flag, el programa imprimirá un mensaje de error y mostrará el texto de ayuda nuevamente.

$ ./command-line-flags -wat
flag provided but not defined: -wat
Usage of ./command-line-flags:
...

Siguiente ejemplo: Command-Line Subcommands.