Някои пособия за командния ред, такива като пособието go или git имат
много подкоманди, всяка от които си има собствен набор от флагове.
Например go build и go get са две различни подкоманди на пособието go.
Пакетът flag ни позволява лесно да опишем прости подкоманди, които имат
свои собствени флагове.
import (
"flag"
"fmt"
"os"
)
func main() {
Обявяваме нова подкоманда с помощта на функцията NewFlagSet и след
това присвояваме нови флагове на върнатия от функцията набор от флагове.
Те принадлежат само на тази новообявена подкоманда.
алаCmd := flag.NewFlagSet("ала", flag.ExitOnError)
алаEnable := алаCmd.Bool("включ", false, "включ")
алаName := алаCmd.String("име", "", "име")
За различна подкоманда, можем да определим други поддържани от подкомандата флагове.
barCmd := flag.NewFlagSet("бала", flag.ExitOnError)
barLevel := barCmd.Int("равнище", 0, "равнище")
Подкомандата се очаква да е първата податка за програмата
if len(os.Args) < 2 {
fmt.Println("очавани подкоманди: 'ала' или 'бала'")
os.Exit(1)
}
Проверяваме коя подкоманда е извикана.
switch os.Args[1] {
За всяка подкоманда разлагаме податките от командния ред в предварително определените флагове.
case "ала":
алаCmd.Parse(os.Args[2:])
fmt.Println("подкоманда 'ала'")
fmt.Println(" включ:", *алаEnable)
fmt.Println(" име:", *алаName)
fmt.Println(" още податки:", алаCmd.Args())
case "бала":
barCmd.Parse(os.Args[2:])
fmt.Println("подкоманда 'бала'")
fmt.Println(" равнище:", *barLevel)
fmt.Println(" още податки:", barCmd.Args())
default:
fmt.Println("очавани подкоманди: 'ала' или 'бала'")
os.Exit(1)
}
}
$ go build command-line-subcommands.go
Първо извикайте подкомандата ала.
$ ./command-line-subcommands ала -включ -име=Краси бала ница
подкоманда 'ала'
включ: true
име: Краси
още податки: [бала ница]
Сега бала.
$ ./command-line-subcommands бала -равнище 8 ба ни ца
подкоманда 'бала'
равнище: 8
още податки: [ба ни ца]
Но бала няма да приеме флаговете на ала.
$ ./command-line-subcommands бала -включ ни ца
flag provided but not defined: -включ
Usage of бала:
-равнище int
равнище
После ще разгледаме променливите на обкръжението, друг обичаен начин за подаване на данни към приложенията.
Следващ пример: Променливи на обкръжението.