Приложения интерфейса командной строки (CLI) могут автоматизировать вашу работу разными способами. Их можно использовать для создания ваших приложений, развертывания кода, запуска процессов и выполнения всевозможных других задач. Разработчики часто отдают предпочтение инструментам CLI, потому что они не требуют пользовательского интерфейса, часто имеют единообразное поведение в разных средах и их намного проще настраивать и распространять. Сообщество Go за последние несколько лет стало намного больше, и из-за этого есть несколько инструментов CLI, которые перешли из сценариев bash в двоичные файлы Go. Нет лучшего времени, чтобы научиться писать приложение CLI самостоятельно.

В этом посте мы рассмотрим, как создать простой инструмент CLI на Go. Вы можете спросить: а зачем мне для этого использовать Go? Для меня это причины: код выразительный, его можно скомпилировать в двоичный файл, который легко распространять, и это очень быстро. Этот пост не является подробным руководством по написанию приложений Go, потому что реализация этих сценариев зависит от вас, как разработчика. Вот почему я буду придерживаться простого "Hello, World!" приложение и добавить немного сложности, так что вы можете начать создавать инструменты интерфейса командной строки в Go для своих собственных проектов.

В этом сообщении предполагается, что вы уже установили Go в своей системе.

Базовое «Hello, World!» заявление

Базовое «Hello, World!» application - хороший способ увидеть в действии некоторые синтаксисы Go. Чтобы приступить к написанию простого приложения CLI на Go, давайте начнем с фразы «Hello, World!» заявление:

Что означает этот код? Сначала мы определяем этот файл как точку входа в наше приложение CLI, указав «package main». Вы можете дать самому файлу любое имя. Обычно я использую main.go, чтобы понять, какой файл является точкой входа в приложение.

Поскольку этот файл является точкой входа в приложение, мы должны определить функцию, которая будет выполняться при ее запуске. Вы делаете это, задавая «основную» функцию. В теле функции ввода печатается знаменитое «Hello, World!» к терминалу. Итак, когда мы запускаем команду:

go run main.go

Вы увидите «Hello World!» в терминале. Теперь, когда мы можем распечатать что-нибудь в терминале, давайте добавим некоторые параметры сложности и конфигурации, работая с флагами.

Добавление флагов в приложение

Флаги используются для настройки приложения. Эти флаги можно использовать во множестве разных языков программирования, включая Go. В этом примере я хочу настроить сообщение, отображаемое в терминале, передав некоторые данные в приложение через флаги. Давайте посмотрим, как мы можем настроить поведение или наше приложение CLI на основе некоторого ввода от пользователя:

Вы можете видеть, что мы определяем два флага для нашего приложения. Один из флагов называется «сообщение», а другой - номер. Опять же, эти имена зависят от вас и ваших потребностей. Мы определяем тип флагов (flag.Int, flag.String), вводим имя флага, значение по умолчанию и полезное сообщение о том, что означает этот флаг.

Теперь, когда мы добавили справочные сообщения, мы можем запустить команду справки:

go run main.go --help

Это вернет возможные флаги, которые вы можете использовать в этой команде:

Usage of /tmp/go-build456763591/b001/exe/main: 
  -message string The message you'd like to print to the terminal (default "Hello, World!") 
  -number int The number you'd like to add to your message (default 1) 
exit status 2

Это полезно в случае, если вам когда-нибудь понадобится запустить двоичный файл, но у вас нет исходного кода для просмотра. Он также отлично подходит для распространения вашего приложения, потому что вы можете сообщить пользователю, какие варианты доступны. Внизу основной функции вы можете увидеть, что я передаю переменную сообщения следующим образом: * message. Это связано с тем, что переменная сообщения на самом деле не имеет значения, а является указателем на место в памяти. Добавив звездочку перед ним, вы извлекаете значение из памяти и можете распечатать его на терминале как обычную строку. Другая переменная, number, передается методу Println как «strconv.Itoa (* number)», потому что значение * number является целым числом, а не строкой. Поскольку Go - это язык со строгой типизацией, вам необходимо преобразовать его в строку, прежде чем вы сможете выполнять какое-либо объединение строк.

Итак, теперь мы можем запустить приложение, как и раньше, без флагов, и увидеть новый текст:

go run main.go

Показывает: «Это сообщение, которое вы хотите отобразить: Hello, World! с номером 1 ”

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

go run main.go --message "Hello, Internet!" --number 42

Показывает: «Это сообщение, которое вы хотите отобразить: Привет, Интернет! с номером 42 ”

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

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

Теперь, когда мы знаем, как передавать значения в наше приложение CLI, хорошо, что это приложение действительно что-то делает за нас. Мы напишем простой скрипт, который считывает содержимое файла и записывает его в другой файл. Мы хотим настроить исходный и целевой файл. Для этого мы будем использовать пакет ioutil. Это простое приложение, но, используя эти методы, вы можете писать сложные программы автоматизации и строить свои приложения таким образом, чтобы они делали именно то, что вам нужно.

Давайте посмотрим на код этого сценария:

Как и раньше, мы определяем два флага. Один представляет исходный файл, а другой - целевой файл. В моем случае я создал файл source.json и добавил это имя файла в качестве значения по умолчанию для приложения. Это содержимое source.json:

{ "message": "This is a message from the source file" }

После анализа флагов мы читаем содержимое исходного файла с помощью ioutil.ReadFile (* sourceFile). Это возвращает данные в байтах, а также ошибку, если что-то пошло не так. Если произошла ошибка, мы отображаем сообщение об ошибке в терминале, чтобы уведомить потребителя приложения о том, что что-то пошло не так при чтении исходного файла. Возможно, у вас не было исходного файла. В этом случае приложение сообщает вам об этом, показывая следующее сообщение:

go run main.go --source src.json

Показывает: «Обнаружена ошибка при чтении исходного файла: open src.json: нет такого файла или каталога»

После отображения сообщения мы обязательно выходим из приложения, потому что у нас нет всей информации, необходимой для продолжения. Возвращая код выхода 1, мы убеждаемся, что терминал знает, что что-то пошло не так. Теперь, когда мы знаем, что у нас есть содержимое файла в памяти, мы можем записать его в целевой файл, используя «ioutil.WriteFile ()», передав имя целевого файла, содержимое файла и соответствующие права доступа к файлу.

Опять же, мы проверяем, если что-то пошло не так, и уведомляем потребителя, если это так. Если все прошло правильно, вы получите следующий результат:

go run main.go --source source.json --target target.json

Показывает: «Содержимое source.json скопировано в target.json»

Теперь у вас должен быть новый файл с именем target.json с тем же содержимым, что и файл source.json. Это очень простой пример, но вы можете увидеть, как вы можете захватить ввод пользователя и использовать его для выполнения какого-либо действия на основе этого ввода. Количество различных приложений, которые вы можете создать с помощью чего-то простого, такого как эти флаги ввода, велико, как ваше воображение.

Заключение

Написание приложений CLI не должно быть трудным. Пишете ли вы сценарии оболочки, Node.js, PHP или Go, они предлагают разработчикам очень широкий спектр возможностей. Приложения CLI могут значительно облегчить вашу жизнь, написав всевозможные виды автоматизации в самых разных средах. Этот пост был посвящен написанию приложений CLI на Go, потому что он выразительный, вы можете скомпилировать его в двоичный файл, а выполнение этих автоматизаций выполняется очень быстро.

Теперь, когда мы рассмотрели основы создания приложения CLI на Go, количество типов приложений и вариантов, которые вы предлагаете для настройки этих приложений, безгранично. Например, вы можете создать приложение, в котором вы выполняете определенные задачи, предлагая пользователю пропустить некоторые задачи. Все зависит от того, что вы хотите и что вам нужно. Я надеюсь, что этот пост показал вам некоторые новые вещи, которые вы могли бы использовать, чтобы начать писать свои собственные приложения CLI на Go.

Если вы хотите поговорить об этом подробнее, вы можете связаться со мной в Twitter.

Размещено: 13 мая 2020 г.

Первоначально опубликовано на https://roelofjanelsinga.com.