flag.Args în Go

Returnează argumentele obișnuite rămase după opțiuni: toate (Args), unul anume (Arg) sau câte sunt (NArg).

Sintaxă
func Args() []string
func Arg(i int) string
func NArg() int

Ce face flag.Args

După flag.Parse(), tot ce nu este opțiune (de obicei nume de fișiere sau subcomenzi) rămâne în flag.Args(). flag.NArg() spune câte sunt, iar flag.Arg(i) returnează argumentul cu numărul i (de la 0) sau "" dacă nu există, fără panică.

Opțiunile se citesc până la primul argument obișnuit sau până la --. De exemplu, ./copiaza -v a.txt b.txt dă Args() = [a.txt b.txt]. Spre deosebire de os.Args, aici nu apare numele programului.

Parametri

Parametru Descriere
i La Arg: poziția argumentului, de la 0.

Ce returnează

Args: un []string. Arg: un text (gol dacă lipsește). NArg: un int.

Exemple

Exemplul 1: Sursă și destinație

package main

import (
    "flag"
    "fmt"
    "os"
)

func main() {
    os.Args = []string{"copiaza", "-v", "poza.jpg", "backup/poza.jpg"}
    detaliat := flag.Bool("v", false, "detalii")
    flag.Parse()

    if flag.NArg() != 2 {
        fmt.Println("utilizare: copiaza [-v] <sursa> <destinatie>")
        return
    }
    fmt.Println("argumente:", flag.Args())
    fmt.Printf("copiez %s în %s (detalii: %v)\n", flag.Arg(0), flag.Arg(1), *detaliat)
    fmt.Printf("Arg(5) = %q\n", flag.Arg(5))
}

Rezultat

argumente: [poza.jpg backup/poza.jpg]
copiez poza.jpg în backup/poza.jpg (detalii: true)
Arg(5) = ""

Exemplul 2: Separatorul –

După --, chiar și textele care încep cu cratimă sunt argumente obișnuite.

package main

import (
    "flag"
    "fmt"
    "os"
)

func main() {
    os.Args = []string{"sterge", "-v", "--", "-fisier-ciudat.txt", "nota.txt"}
    flag.Bool("v", false, "detalii")
    flag.Parse()
    for i := 0; i < flag.NArg(); i++ {
        fmt.Printf("%d: %s\n", i, flag.Arg(i))
    }
}

Rezultat

0: -fisier-ciudat.txt
1: nota.txt

Greșeli frecvente

  • Folosești os.Args[1] în loc de flag.Arg(0). os.Args conține și opțiunile și numele programului.
  • Accesezi flag.Args()[0] fără să verifici NArg(): panică dacă lista e goală. flag.Arg(0) returnează "" în siguranță.

Comenzi înrudite

  • flag.Parse: Citește opțiunile din linia de comandă (os.Args) și completează variabilele definite cu flag.String, flag.Int etc.
  • flag.NewFlagSet: Creează un set separat de opțiuni, util pentru subcomenzi (git commit, git push) și pentru teste.
  • flag.Bool: Definește o opțiune da/nu: simpla prezență (-v) o face true.