gobyexample/examples/command-line-subcommands/command-line-subcommands.go
2019-10-12 21:08:18 +03:00

58 lines
2.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Некоторые инструменты командной строки, такие как `go`
// или `git`, имеют много *подкоманд*, каждая со своим
// собственным набором флагов. Например, `go build` и
// `go get` - это две разные подкоманды инструмента `go`.
// Пакет `flag` позволяет нам легко определять простые
// подкоманды, которые имеют свои собственные флаги.
package main
import (
"flag"
"fmt"
"os"
)
func main() {
// Мы объявляем подкоманду, используя функцию `NewFlagSet`,
// и приступаем к определению новых флагов, специфичных
// для этой подкоманды.
fooCmd := flag.NewFlagSet("foo", flag.ExitOnError)
fooEnable := fooCmd.Bool("enable", false, "enable")
fooName := fooCmd.String("name", "", "name")
// Для другой подкоманды мы можем определить другие
// флаги.
barCmd := flag.NewFlagSet("bar", flag.ExitOnError)
barLevel := barCmd.Int("level", 0, "level")
// Подкоманда ожидается в качестве первого аргумента
// программы.
if len(os.Args) < 2 {
fmt.Println("expected 'foo' or 'bar' subcommands")
os.Exit(1)
}
// Проверяем, какая подкоманда вызвана.
switch os.Args[1] {
// Для каждой подкоманды мы анализируем ее собственные
// флаги и имеем доступ к аргументам.
case "foo":
fooCmd.Parse(os.Args[2:])
fmt.Println("subcommand 'foo'")
fmt.Println(" enable:", *fooEnable)
fmt.Println(" name:", *fooName)
fmt.Println(" tail:", fooCmd.Args())
case "bar":
barCmd.Parse(os.Args[2:])
fmt.Println("subcommand 'bar'")
fmt.Println(" level:", *barLevel)
fmt.Println(" tail:", barCmd.Args())
default:
fmt.Println("expected 'foo' or 'bar' subcommands")
os.Exit(1)
}
}