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 deflag.Arg(0).os.Argsconține și opțiunile și numele programului. - Accesezi
flag.Args()[0]fără să verificiNArg(): 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.