Skip to content

Пакет flag в Go

В этой теме мы рассмотрим:

  • Что такое флаги и когда они используются.

  • Как работать с позиционными аргументами.

  • Как реализовать субкоманды с помощью FlagSet.

Важно! Код, над которым ты будешь работать по мере прохождения темы, необходимо разместить по пути module2/stl/flags/.

Что такое flag

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

Далее мы рассмотрим различные способы использования пакета flag для построения различных видов утилит командной строки.

Использование флага для изменения поведения программы

Использование пакета flag предусматривает три шага:

  1. Вначале определяются переменные для сбора значений флагов.

  2. Затем определяются флаги для использования приложением Go. 

  3. В заключение производится проверка синтаксиса флагов, переданных приложению при выполнении.

Большинство функций в пакете flag связаны с определением флагов и их привязке к определенным тобой переменным. Синтаксическая проверка выполняется функцией Parse().

Для иллюстрации мы создадим программу, определяющую флаг Boolean для изменения сообщения, которое потом выводится стандартным способом. Если используется флаг -color, программа выводит сообщение синим цветом. Если флаг не указан, сообщение выводится без цветов.

Создай новый файл с именем boolean.go.

Для создания программы добавь в файл этот код.

В этом примере используются управляющие последовательности ANSI, предписывающие терминалу выводить цветной текст. Это специальные последовательности символов, поэтому для них полезно определить новый тип. В этом примере мы присвоили типу имя Color и определили его как string. Затем мы определили палитру цветов для использования в следующем блоке const. Функция colorize, определяемая после блока const, принимает одну из констант Color и переменную string для сообщения, которому назначается цвет. Затем она предписывает терминалу изменить цвет, сначала выводя управляющую последовательность для запрошенного цвета, а затем выводя сообщение, и, наконец, запрашивает сброс цвета терминала посредством вывода специальной последовательности сброса цвета.

В main мы используем функцию flag.Bool для определения флага логического оператора с именем color. Второй параметр этой функции — false — задает значение этого флага по умолчанию, если оно отсутствует. Хотя ты можешь ожидать иного, установка значения true не меняет поведения, так как при задании флага оно становится ложным. Поэтому этот параметр почти всегда будет иметь значение false с флагами логических операторов.

Последний параметр — это строка документации, которая может быть выведена как сообщение об использовании. Возвращаемое этой функцией значение представляет собой указатель на bool. Функция flag.Parse на следующей строке использует этот указатель, чтобы задать переменную bool на базе флагов, передаваемых пользователем. Мы сможем проверить значение этого указателя bool, сняв ссылку на указатель. Дополнительную информацию о переменных указателей можно найти в обучающем руководстве по указателям. Используя это логическое значение, мы можем вызывать функцию colorize, если флаг -color установлен, и вызывать переменную fmt.Println, если флаг отсутствует.

Сохрани файл и запусти программу без флагов.

Вывод должен выглядеть так.

Теперь запусти эту программу еще раз с помощью флага -color.

При этом также будет выведен текст, но при этом синим цветом.

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