Go в примери: Подкоманди на командния ред

Някои пособия за командния ред, такива като пособието go или git имат много подкоманди, всяка от които си има собствен набор от флагове. Например go build и go get са две различни подкоманди на пособието go. Пакетът flag ни позволява лесно да опишем прости подкоманди, които имат свои собствени флагове.

package main
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
        равнище

После ще разгледаме променливите на обкръжението, друг обичаен начин за подаване на данни към приложенията.

Следващ пример: .