
Dando continuidade a Série Go veremos que trabalhar com parâmetros de linha de comando é uma habilidade essencial para desenvolvedores Golang, permitindo criar aplicativos mais flexíveis e configuráveis.
Neste artigo, exploraremos diferentes métodos para processar argumentos de linha de comando em Go, desde o básico até técnicas mais avançadas.
osA maneira mais simples de acessar argumentos em Go é através do pacote os, que fornece a variável Args.
package main
import (
    "fmt"
    "os"
)
func main() {
    // os.Args[0] é o nome do programa
    // os.Args[1] em diante são os argumentos
    if len(os.Args) > 1 {
        fmt.Println("Argumentos recebidos:", os.Args[1:])
    } else {
        fmt.Println("Nenhum argumento fornecido.")
    }
}Exemplo de uso:
$ ./args arg1 arg2 arg3
Argumentos recebidos: [arg1 arg2 arg3]flag: Para opções mais sofisticadasPara um parsing mais robusto de argumentos, incluindo flags (como -h ou --help), Go oferece o pacote flag.
flag:package main
import (
    "flag"
    "fmt"
)
func main() {
    // Definindo flags
    nome := flag.String("nome", "Visitante", "Seu nome")
    idade := flag.Int("idade", 0, "Sua idade")
    admin := flag.Bool("admin", false, "É administrador?")
    // Parse dos argumentos
    flag.Parse()
    // Usando os valores
    fmt.Printf("Olá, %s! Você tem %d anos.\n", *nome, *idade)
    if *admin {
        fmt.Println("Privilégios de administrador ativados.")
    }
}Exemplo de uso:
$ ./args -nome João -idade 30 -admin
Olá, João! Você tem 30 anos.
Privilégios de administrador ativados.Você também pode processar argumentos posicionais (não nomeados) após as flags:
package main
import (
    "flag"
    "fmt"
)
func main() {
    flag.Parse()
    args := flag.Args() // Argumentos posicionais
    
    if len(args) > 0 {
        fmt.Println("Argumentos posicionais:", args)
    }
}Para aplicativos mais complexos (como git commit ou docker ps), você pode implementar subcomandos:
package main
import (
    "flag"
    "fmt"
    "os"
)
func main() {
    if len(os.Args) < 2 {
        fmt.Println("Uso: args <comando> [args]")
        os.Exit(1)
    }
    switch os.Args[1] {
    case "add":
        addCmd := flag.NewFlagSet("add", flag.ExitOnError)
        item := addCmd.String("item", "", "Item para adicionar")
        addCmd.Parse(os.Args[2:])
        fmt.Printf("Adicionando: %s\n", *item)
        
    case "list":
        listCmd := flag.NewFlagSet("list", flag.ExitOnError)
        all := listCmd.Bool("all", false, "Listar todos os itens")
        listCmd.Parse(os.Args[2:])
        fmt.Printf("Listando (all=%v)\n", *all)
        
    default:
        fmt.Printf("Comando desconhecido: %s\n", os.Args[1])
        os.Exit(1)
    }
}Outras alternativas:
spf13/cobra - Para aplicativos CLI sofisticadosurfave/cli - Alternativa popular ao pacote flagDicas:
-h ou --help)Acompanhe a Série Go.