Pacote flag & Flags Estilo POSIX
O pacote flag da biblioteca padrão do Go analisa opções de linha de comando sem dependências de terceiros.
Busque em todas as páginas da documentação
O pacote flag da biblioteca padrão do Go analisa opções de linha de comando sem dependências de terceiros.
Ele suporta tipos booleanos, string, inteiros, duração e flag.Value personalizados, com -nome=valor estilo POSIX e flags curtas booleanas clusterizadas.
Para ferramentas multi-comando, instâncias dedicadas de flag.FlagSet evitam que as flags de subcomandos colidam.
flag registra variáveis antes de Parse, e então as modifica a partir de os.Args.
O conjunto padrão é flag.CommandLine; CLIs de produção frequentemente usam flag.NewFlagSet por subcomando.
O texto de uso, tratamento de erros e saída de ajuda são personalizáveis para que scripts e humanos obtenham um comportamento previsível.
Cartão de receita de referência rápida - pronto para copiar e colar.
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, "tempo limite da operação")
_ = fs.Parse(os.Args[2:])Quando usar isso:
switch em 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("o modo deve ser dry ou 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 ou apply")
verbose := fs.Bool("v", false, "logging verboso")
timeout := fs.Duration("timeout", 10*time.Second, "tempo máximo de espera")
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())
}O que isso demonstra:
flag.Value com Set e String.fs.Var registra enumerações com validação em Set.Duration analisam strings de duração do Go (300ms, 2m).String, Bool, Int, Var) grava metadados em um FlagSet.Parse percorre os argumentos: flags começam com -; o primeiro token não-flag encerra a análise de flags, a menos que FlagSet tenha sido configurado de outra forma.-v, -v=true e -v=false.Args() retorna os tokens posicionais restantes.| Forma | Exemplo | Notas |
|---|---|---|
| Longa com valor | -timeout=30s | Preferível para scripts |
| Longa separada por espaço | -timeout 30s | Suportado para flags não-booleanas |
| Booleana curta | -v | Define como true |
| Cauda posicional | file.txt | Disponível via Args() |
| Flag desconhecida | -zzz | Dispara Usage e então sai (conjunto padrão) |
| Modo | Comportamento |
|---|---|
flag.ExitOnError | Imprime erro + uso, os.Exit(2) |
flag.ContinueOnError | Retorna erro de análise para o chamador |
flag.PanicOnError | Entra em pânico no erro de análise (raro em aplicativos) |
// Introspect flags em testes
fs.Visit(func(f *flag.Flag) {
t.Log(f.Name, f.Value.String())
})flag.CommandLine em bibliotecas; exporte uma Run(args []string) que use um FlagSet privado.--long não é nativo; os usuários esperam o estilo POSIX de um único traço, a menos que você adicione um wrapper.embed ou padrões de env em main, não dentro de pacotes reutilizáveis.String tardias após Parse silenciosamente perdem argv. Correção: registre todas as flags na inicialização antes de Parse.flag.CommandLine global em testes - Testes paralelos disputam o mesmo conjunto. Correção: NewFlagSet por caso de teste.fs.Parse(os.Args[2:]) ausente - O nome do subcomando é analisado como um valor de flag. Correção: fatie os argumentos após o token do subcomando.tool --help | grep misturados com pipes de dados. Correção: sempre Fprintf(os.Stderr, ...).| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| cobra / urfave/cli | Muitos subcomandos, completude | Uma única flag -config é suficiente |
| Configuração apenas por env | Ferramentas containerizadas com env injetado | Operadores precisam de arquivos de substituição locais |
kong / go-flags | Análise orientada por tags de struct | Você quer zero dependências de terceiros |
Varredura manual de os.Args | Scripts minúsculos | Validação e texto de ajuda importam |
Não nativamente.
Usuários passam -nome ou -nome=valor.
Bibliotecas como cobra adicionam compatibilidade GNU se seu público espera isso.
Verifique após Parse: se *api == "", chame Usage e saia.
cobra oferece MarkFlagRequired para a mesma guarda.
O FlagSet padrão para a análise de flags no primeiro argumento não-flag.
Use um framework ou um analisador personalizado se precisar de intercalação GNU.
Chame fs.Parse([]string{"-v", "file"}) em um FlagSet dedicado.
Nunca confie no flag.Parse global em testes paralelos.
ExitOnError usa o código de saída 2 após imprimir o uso.
Documente seus próprios códigos para falhas de lógica de negócios separadamente.
Os padrões são impressos usando o método String() da flag.
flag.Duration mostra valores legíveis como 10s.
Registre duas flags apontando para a mesma variável, ou use aliases do cobra.
A biblioteca padrão não fornece aliases sozinha.
go test consome suas próprias flags.
Execute go test ./... -- -myflag para passar flags para o binário de teste, ou teste uma função de pacote diretamente.
Evite isso.
Deixe main gerenciar a configuração da CLI para que os importadores não sejam surpreendidos por efeitos colaterais globais.
Quando você precisa de completude do shell, flags pai persistentes ou ajuda em markdown gerada automaticamente.
Atualize para cobra ou urfave/cli mantendo o mesmo binário main.
Versões da Stack: Esta página foi escrita para Go 1.26.x (padrão GC Green Tea, go fix modernizers - verifique o patch na compilação), chi (última - verifique na compilação), gin (última - verifique na compilação), echo (última - verifique na compilação), google.golang.org/grpc (última - verifique na compilação), sigs.k8s.io/controller-runtime (última - verifique na compilação), kubebuilder (última - verifique na compilação), tinygo (última - verifique os alvos de placa na compilação), wazero (última - verifique na compilação) e golangci-lint (última - verifique o conjunto de linters na compilação).
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026