flag.Usage în Go

Variabila care ține funcția de afișare a ajutorului; o înlocuiești ca să-ți scrii propriul mesaj de utilizare.

Sintaxă
var Usage = func() { ... }

Ce face flag.Usage

flag.Usage nu este o funcție obișnuită, ci o variabilă de tip func(). Ea este apelată de flag.Parse când utilizatorul scrie -h / -help sau dă o opțiune greșită. Varianta implicită afișează „Usage of program:” urmat de flag.PrintDefaults().

Îi atribui o funcție proprie (înainte de Parse) ca să adaugi descrierea programului, exemple de folosire sau argumentele obișnuite. Scrie în flag.CommandLine.Output(), ca mesajul să ajungă acolo unde ajunge restul ajutorului.

Ce returnează

Nu se aplică (este o variabilă).

Exemple

Exemplul 1: Mesaj de utilizare propriu, afișat la -h

Simulăm comanda ./redimensioneaza -h. Parse afișează ajutorul și oprește programul cu codul 0.

package main

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

func main() {
    os.Args = []string{"redimensioneaza", "-h"}
    flag.CommandLine.SetOutput(os.Stdout)

    flag.Int("latime", 800, "lățimea nouă, în pixeli")
    flag.Int("calitate", 85, "calitatea JPEG (1-100)")
    flag.Usage = func() {
        out := flag.CommandLine.Output()
        fmt.Fprintln(out, "redimensioneaza - micșorează imagini JPEG")
        fmt.Fprintln(out, "")
        fmt.Fprintln(out, "Utilizare: redimensioneaza [opțiuni] imagine1.jpg [imagine2.jpg ...]")
        fmt.Fprintln(out, "Opțiuni:")
        flag.PrintDefaults()
    }
    flag.Parse()
    fmt.Println("această linie nu se mai execută")
}

Rezultat

redimensioneaza - micșorează imagini JPEG

Utilizare: redimensioneaza [opțiuni] imagine1.jpg [imagine2.jpg ...]
Opțiuni:
  -calitate int
    	calitatea JPEG (1-100) (default 85)
  -latime int
    	lățimea nouă, în pixeli (default 800)

Exemplul 2: Ajutorul la argumente lipsă

package main

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

func main() {
    os.Args = []string{"traduce"}
    flag.CommandLine.SetOutput(os.Stdout)
    flag.String("din", "en", "limba sursă")
    flag.String("in", "ro", "limba țintă")
    flag.Usage = func() {
        fmt.Fprintln(flag.CommandLine.Output(), "Utilizare: traduce [-din en] [-in ro] text...")
        flag.PrintDefaults()
    }
    flag.Parse()

    if flag.NArg() == 0 {
        flag.Usage()
        return
    }
}

Rezultat

Utilizare: traduce [-din en] [-in ro] text...
  -din string
    	limba sursă (default "en")
  -in string
    	limba țintă (default "ro")

Greșeli frecvente

  • Scrii cu fmt.Println în Usage, iar PrintDefaults scrie pe stderr. Mesajul ajunge jumătate pe un canal, jumătate pe celălalt; folosește flag.CommandLine.Output().
  • Setezi flag.Usage după flag.Parse(). La o eroare de parsare se folosește încă varianta implicită.

Comenzi înrudite

  • flag.PrintDefaults: Afișează lista tuturor opțiunilor definite, cu tipul, descrierea și valoarea implicită.
  • flag.Parse: Citește opțiunile din linia de comandă (os.Args) și completează variabilele definite cu flag.String, flag.Int etc.
  • flag.Args: Returnează argumentele obișnuite rămase după opțiuni: toate (Args), unul anume (Arg) sau câte sunt (NArg).