Go podle Příkladů: Příznaky na příkazové řádce

Příznaky na příkazové řádce jsou běžným způsobem pro nastavení voleb pro příkazovou řádku programů. Například, u wc -l volba -l je příznak příkazové řádky (command-line flag).

package main

Go poskytuje balíček flag pro podporu základního parsování příznaků z příkazové řádky. Použijeme tento balíček pro implementaci našeho příkladu programu pro příkazovou řádku.

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

Základní deklarace příznaků jsou dostupné pro volby typu řetězec, integer, a boolean. Zde deklarujeme řetězcový příznak word s výchozí hodnotou "foo" a krátkým popisem. Tato funkce flag.String vrací ukazatel na řetězec ; (ne hodnotu řetězce) a dále uvidíme jak těnto ukazatel použít.

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

Toto deklaruje příznaky numb a fork s použitím podobného přístupu jako u příznaku word.

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

Také je možné deklarovat příznak který používá existující proměnnou deklarovanou jinde v programu. Všimněte si, že do funkce deklarující příznak musíme předat ukazatel.

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

Když jsou všechny příznaky deklarované, zavoláme flag.Parse() pro naparsování příkazové řádky.

    flag.Parse()

Tady jenom vypíšeme naparsované volby a všechny zbývající poziční argumenty. Všimněte si že ukazatele musíme dereferencovat pomocí např. *wordPtr k získání vlastních hodnot voleb.

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

Pro experimentování s volbami na příkazové řádce je nejlepší program nejdřív zkompilovat a pak spouštět výslednou binárku přímo.

$ go build command-line-flags.go

Vyzkoušíme zbuildovaný program nejdřív poskytnutím hodnot pro všechny volby.

$ ./command-line-flags -word=opt -numb=7 -fork -svar=flag
word: opt
numb: 7
fork: true
svar: flag
tail: []

Všimněte si, že když volby vynecháme, dostanou automaticky své výchozí hodnoty.

$ ./command-line-flags -word=opt
word: opt
numb: 42
fork: false
svar: bar
tail: []

Zbývající poziční argumenty je možné poskytnout po nějakých volbách.

$ ./command-line-flags -word=opt a1 a2 a3
word: opt
...
tail: [a1 a2 a3]

Všimněte si, že balíček flag vyžaduje aby všechny se všechny volby nastavily před pozičními argumenty (jinak budou volby interpretované jako poziční argumenty).

$ ./command-line-flags -word=opt a1 a2 a3 -numb=7
word: opt
numb: 42
fork: false
svar: bar
tail: [a1 a2 a3 -numb=7]

Použij volby -h nebo --help pro získání automaticky generovaného textu nápovědy pro přkazovou řádku programu.

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

Pokud použiješ volbu která nebyla předem specifikovaná balíčku flag, program vypíše chybovou hlášku a ukáže znovu text nápovědy.

$ ./command-line-flags -wat
flag provided but not defined: -wat
Usage of ./command-line-flags:
...

Další příklad: Podpříkazy příkazové řádky.