Command-Line Flags
#
// [_Command-line flags_](https://en.wikipedia.org/wiki/Command-line_interface#Command-line_option)
// ou bandeiras de linha de comando, são uma forma
// comum de especificar opções para programas em
// linha de comando. Por exmeplo, em `wc -l` o
//`-l` é uma flag.
package main
// Go fornece um pacote `flag` que suporta parseamento
// básico de flags. Será usado este pacote para a
// implementação do exemplo.
import (
"flag"
"fmt"
)
func main() {
// Declarações básicas de flag estão disponíveis para
// strings, inteiros e booleanos. Aqui, é declarado uma
// string com a flag `word` com um valor padrão `"foo"`
// e uma descrição curta. Esta função `flag.String` retorna
// um ponteiro de string (não um valor em string);
// mais adiante será abordado como utilizar este ponteiro.
wordPtr := flag.String("word", "foo", "a string")
// Aqui são declaradas as flags `numb` e `fork`, usando
// um approach similar à flag `word`.
numbPtr := flag.Int("numb", 42, "an int")
forkPtr := flag.Bool("fork", false, "a bool")
// Também é possível declarar uma opção que use uma
// variável existente, declarada em algum lugar do
// código. Note que será preciso passar um ponteiro
// para a função que declara a flag.
var svar string
flag.StringVar(&svar, "svar", "bar", "a string var")
// Uma vez que todas as flags estão declaradas, chama-se
// `flag.Parse()` para executar o parseamento.
flag.Parse()
// Aqui as flags e qualquer eventual argumento posicional
// serão apenas exibidos. Note que é necessário realizar
// a _dereference_ dos ponteiros, por exemplo, com a sintaxe
// `*wordPtr` para acessar os valores.
fmt.Println("word:", *wordPtr)
fmt.Println("numb:", *numbPtr)
fmt.Println("fork:", *forkPtr)
fmt.Println("svar:", svar)
fmt.Println("tail:", flag.Args())
}
# Para testar o programa das flags, é melhor
# é melhor criar um binário com o comando `go build`
# antes.
$ go build command-line-flags.go
# Execute o programa passando valores para
# todas as flags.
$ ./command-line-flags -word=opt -numb=7 -fork -svar=flag
word: opt
numb: 7
fork: true
svar: flag
tail: []
# Note que, se alguma flag for omitida, elas
# automaticamente são iniciadas com os valores
# padrão estipulados.
$ ./command-line-flags -word=opt
word: opt
numb: 42
fork: false
svar: bar
tail: []
# argumentos podem ser fornecidos depois das flags.
$ ./command-line-flags -word=opt a1 a2 a3
word: opt
...
tail: [a1 a2 a3]
# Note que o pacote `flag` requer que todas as flags
# sejam usadas antes de argumentos. Do contrário, as
# flags serão interpretadas como argumentos.
$ ./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-se as flags `-h` ou `--help` para acessar
# um texto de auxílio à utilização do programa.
$ ./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
# Se for utilizada uma flag que não foi
# especificada no pacote `flag`, o programa
# irá exibir uma mensagem de erro
# juntamente com um texto de auxílio.
$ ./command-line-flags -wat
flag provided but not defined: -wat
Usage of ./command-line-flags:
...