Go в примерах: Флаги командной строки (Command-Line Flags)

Флаги командной строки это популярный способ указывать опции для консольных программ. К примеру, в команде wc -l -l является флагом командной строки.

package main

В Go есть пакет flag, обеспечивающий базовые функции для работы с флагами. Мы будем использовать этот пакет для нашей демонстрационной консольной программы.

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

Базовые определения флагов доступны для типов string, integer и boolean. Тут мы определяем флаг-строку word со значением по-умолчанию "foo" и коротким описанием. Функция flag.String возвращает указатель на строку (а не саму строку); мы посмотрим, как использовать этот указатель ниже.

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

Тут мы декларируем флаги numb и fork, используя аналогичный подход, как и с флагом word.

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

Также флаги можно определять, используя существующую переменную, объявленную ранее в программе. Обратите внимание, что мы передаем в функцию указатель.

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

Как только все флаги определены, вызываем flag.Parse(), чтобы выполнить непосредственно разбор командной строки.

    flag.Parse()

Тут мы выводим на экран считанные значения флагов, и оставшиеся аргументы командной строки. Обратите внимание. что мы должны разыменовывать указатель, *wordPtr, например, чтобы получить реальные значения.

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

Чтобы поэкспериментировать с флагами командной строки, лучше всего сначала скомпилировать код, а затем запускать бинарный файл напрямую.

$ go build command-line-flags.go

Попробуйте запустить собранную программу, сначала указав значения для всех флагов.

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

Заметьте, если вы пропустите какие-то флаги, они будут равны значениям по-умолчанию.

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

Оставшиеся элементы командной строки будут выведены в конце.

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

Обратите внимание, что пакет flag требует, чтобы все флаги были указаны до оставшихся элементов командной строки. В противном случае, флаги будут обработаны как оставшиеся аргументы.

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

Используйте флаги -h или --help, чтобы вывести на экран автоматически сгенерированное текст с описанием флагов.

$ ./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

Если вы укажете флаг, который не был указан в программе, то flag выдаст сообщение об ошибке и текст со всеми возможными флагами.

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

Далее мы познакомимся с переменными окружения, еще одним способом параметризации программ.

Следующий пример: Переменные окружения (Environment Variables).