Go by Example: Flag Linea Comando

I flag da linea di comando sono un modo comune per specificare opzioni per programmi da linea di comando. Per esempio, in wc -l il -l è un flag da linea di comando.

package main

Go fornisce un pacchetto flag che supporta il parsing di base dei flag da linea di comando. Useremo questo pacchetto per implementare il nostro programma di esempio.

import (
    "flag"
    "fmt"
)
func main() {

Dichiarazioni di flag di base sono disponibili per opzioni string, integer e boolean. Qui dichiariamo un flag string word con valore di default "foo" e una breve descrizione. Questa funzione flag.String restituisce un puntatore string; vedremo come usarlo sotto.

    wordPtr := flag.String("word", "foo", "a string")

Questo dichiara i flag numb e fork, usando un approccio simile al flag word.

    numbPtr := flag.Int("numb", 42, "an int")
    forkPtr := flag.Bool("fork", false, "a bool")

È anche possibile dichiarare un’opzione che usa una var esistente dichiarata altrove nel programma. Nota che dobbiamo passare un puntatore alla funzione di dichiarazione del flag.

    var svar string
    flag.StringVar(&svar, "svar", "bar", "a string var")

Una volta dichiarati tutti i flag, chiama flag.Parse() per eseguire il parsing da linea di comando.

    flag.Parse()

Qui stamperemo le opzioni parsate e qualsiasi argomento posizionale finale. Nota che dobbiamo dereferenziare i puntatori con es. *wordPtr per ottenere i valori effettivi delle opzioni.

    fmt.Println("word:", *wordPtr)
    fmt.Println("numb:", *numbPtr)
    fmt.Println("fork:", *forkPtr)
    fmt.Println("svar:", svar)
    fmt.Println("tail:", flag.Args())
}

Per sperimentare con il programma dei flag da linea di comando è meglio prima compilarlo e poi eseguire direttamente il binario risultante.

$ go build flag-linea-comando.go

Prova il programma compilato fornendogli prima valori per tutti i flag.

$ ./flag-linea-comando -word=opt -numb=7 -fork -svar=flag
word: opt
numb: 7
fork: true
svar: flag
tail: []

Nota che se ometti i flag assumono automaticamente i loro valori di default.

$ ./flag-linea-comando -word=opt
word: opt
numb: 42
fork: false
svar: bar
tail: []

Argomenti posizionali finali possono essere forniti dopo qualsiasi flag.

$ ./flag-linea-comando -word=opt a1 a2 a3
word: opt
...
tail: [a1 a2 a3]

Nota che il pacchetto flag richiede che tutti i flag appaiano prima degli argomenti posizionali (altrimenti i flag saranno interpretati come argomenti posizionali).

$ ./flag-linea-comando -word=opt a1 a2 a3 -numb=7
word: opt
numb: 42
fork: false
svar: bar
tail: [a1 a2 a3 -numb=7]

Usa i flag -h o --help per ottenere automaticamente il testo di aiuto per il programma da linea di comando.

$ ./flag-linea-comando -h
Usage of ./flag-linea-comando:
  -fork=false: a bool
  -numb=42: an int
  -svar="bar": a string var
  -word="foo": a string

Se fornisci un flag che non è stato specificato al pacchetto flag, il programma stamperà un messaggio di errore e mostrerà di nuovo il testo di aiuto.

$ ./flag-linea-comando -wat
flag provided but not defined: -wat
Usage of ./flag-linea-comando:
...

Prossimo esempio: .