Biblioteca cobra/pflag para Go: flags de linha de comando poderosas
No mundo do desenvolvimento em Go, criar interfaces de linha de comando (CLI) práticas e flexíveis é uma tarefa essencial. A biblioteca padrão flag oferece funcionalidades básicas para análise de flags, mas seu alcance é limitado. É aí que entra o cobra/pflag — uma biblioteca robusta que expande os recursos do pacote padrão e é parte fundamental do ecossistema Cobra (o framework popular para criar aplicações CLI).
A principal vantagem do pflag sobre o flag padrão é o suporte a estilos de flags tanto POSIX/GNU (flags longas com hífen duplo, como --verbose) quanto BSD (flags curtas com um hífen, como -v). A biblioteca também permite combinar flags curtas (-abc em vez de -a -b -c), flags com argumentos obrigatórios, flags contadoras e muito mais. O pflag é totalmente compatível com a interface flag.Value, facilitando a migração de código existente.
Essa biblioteca é amplamente utilizada em projetos conhecidos como Kubernetes, Helm, Hugo e muitos outros. Se você planeja criar uma aplicação CLI séria em Go, o pflag será uma ferramenta indispensável, oferecendo flexibilidade, desempenho e conformidade com os padrões modernos de linha de comando.
Instalação
A instalação da biblioteca é feita da forma padrão do Go, usando o gerenciador de pacotes go get:
go get github.com/spf13/pflag
Após executar este comando, a biblioteca será adicionada ao seu módulo Go (arquivo go.mod). Agora você pode importá-la no seu código:
import "github.com/spf13/pflag"
Início rápido
Vamos criar uma aplicação simples que recebe um nome de usuário e uma flag para exibir uma saudação:
package main
import (
"fmt"
"github.com/spf13/pflag"
)
func main() {
// Definindo as flags
name := pflag.String("name", "Mundo", "nome para a saudação")
verbose := pflag.BoolP("verbose", "v", false, "exibir saída detalhada")
// Analisando as flags
pflag.Parse()
// Usando os valores
if *verbose {
fmt.Printf("Modo: detalhado\n")
fmt.Printf("Nome: %s\n", *name)
}
fmt.Printf("Olá, %s!\n", *name)
}
Execute o programa com diferentes flags:
go run main.go
go run main.go --name=Go
go run main.go -n Go -v
go run main.go --verbose --name "Desenvolvedor Go"
Métodos e funções principais
1. pflag.String(name, shorthand, value, usage)
Assinatura: func String(name string, shorthand string, value string, usage string) *string
Cria uma flag do tipo string com o nome especificado, forma abreviada, valor padrão e descrição. Retorna um ponteiro para string.
host := pflag.StringP("host", "H", "localhost", "endereço do servidor")
pflag.Parse()
fmt.Printf("Conectando a %s\n", *host)
2. pflag.Int(name, shorthand, value, usage)
Assinatura: func Int(name string, shorthand string, value int, usage string) *int
Cria uma flag do tipo inteiro. Útil para especificar portas, limites e outros parâmetros numéricos.
port := pflag.IntP("port", "p", 8080, "porta para escutar")
pflag.Parse()
fmt.Printf("Servidor rodando na porta %d\n", *port)
3. pflag.Bool(name, shorthand, value, usage)
Assinatura: func Bool(name string, shorthand string, value bool, usage string) *bool
Cria uma flag do tipo booleano. Flags do tipo chave que não exigem valor (apenas a presença da flag já a ativa).
Também na biblioteca
Processamento JSON em Swift: Codable, Foundation e SwiftyJSON para iOS/macOS
Validação de dados em C++: bibliotecas e métodos (libvalidate, nlohmann/json, Boost)
Agendador de Tarefas em Node.js (node-cron, node-schedule, Bull)
Trabalhando com CSV em Swift (iOS/macOS) — bibliotecas e exemplos de código