Go in a nutshell
  • Go in a nutshell
  • Введение
  • Родословная или Should I Go?
  • Hello, world!
  • Базовые типы данных
  • Go - установка, сборка
  • Алфавит и пакеты
  • Синтаксис
  • Приведение типов
  • Операторы
  • Константы
  • Управление потоком
  • Массивы, срезы, отображения
  • Именованные типы и структуры
  • Указатели и оператор new
  • Функции
  • Работа с параметрами командной строки
  • Завершение работы программы
  • Методы
Powered by GitBook
On this page
  • os.Args
  • Пакет flag

Was this helpful?

Работа с параметрами командной строки

Движение приносит победу

Говоря на чистоту, у автора было велико желание (и логика повествования требует этого), после рассмотрения функций незамедлительно перейти к методам, которые есть разновидность функций. Но есть вопросы, которые требуют ответов. давайте же сейчас заполним один из таких пробелов в наших знаниях, а именно: разберёмся с параметрами командной строки и способами их обработки.

Фактически, инструментов для такой работы - два. Это переменная пакета os, именуемая os.Args, а также специальный пакет flag. Пойдём по порядку.

os.Args

Экспортируемая переменная пакета os - os.Args - имеет тип []string. В первом элементе данного среза - os.Args[0] хранится название собственно текущего исполняемого файла, поэтому полезная информация начинается только со второго элемента:

package main

import (
	"fmt"
	"os"
)

func main() {
	fmt.Printf("%T\n", os.Args)
	fmt.Println(os.Args)

}
//Результат:
//D:\build>build.exe qwerty asdfg
//[]string
//[build.exe qwerty asdfg]

Как видите, данная переменная содержит просто строки, и нет никаких инструментов, которые бы позволяли ввести синтаксис командной строки в привычном стиле, как, к примеру, -param: или --help. Таким образом, используя os.Args вы будете вынуждены вручную парсить и обрабатывать пользовательский ввод, требуя от пользователя следовать вашему замыслу. приведу пример такой развёрнутой обработки user input`а:

if len(os.Args) == 1 {
	fmt.Println("Параметры командной строки не заданы.\nИспользую автоопределение.")
		// some code here
}

if len(os.Args) == 3 {
	if os.Args[1] == "-p" || os.Args[1] == "-P" {
		if _, err := strconv.Atoi(os.Args[2]); err != nil { // проверка на тип int
			log.Fatal("Неверные параметры командной строки\nЗначение [Port number] не является INT.")
		} else {
			log.Fatal("Неверные параметры командной строки\nUsage: -p [Port number]")
		}
		//some code here
	}
}

if len(os.Args) == 2 || len(os.Args) > 3 {
	log.Fatal("Неверные параметры командной строки\nUsage: -p [Port number]")
}

Как видите, решение вполне работоспособно, но несколько громоздко. Теперь рассмотрим более специализированное решение - пакет flag.

Пакет flag

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

package main

import (
	"flag"
	"fmt"
)

var (
	//Синтаксис: flag.имя_типа(имя параметра, значение по умолчанию, справка)
	ipAddr = flag.String("ip", "", "IP address")
	port   = flag.String("port", "2000", "TCP port")
	wsp    = flag.String("wsp", "3000", "WebSocket port")
	dbg    = flag.Int("dbg", 0, "Set 1 for debug ")
)

func main() {

	flag.Parse()

	fmt.Println(*ipAddr)
	fmt.Println(*port)
	fmt.Println(*wsp)
	fmt.Println(*dbg)


}
//Результат:

/* без параметров
D:\build>build.exe
2000
3000
0
*/

/* неверный флаг (вывод автосправки)
D:\build>build.exe -qwerty
flag provided but not defined: -qwerty
Usage of build.exe:
  -dbg int
        Set 1 for debug
  -ip string
        IP address
  -port string
        TCP port (default "2000")
  -wsp string
        WebSocket port (default "3000")
*/

/* все параметры заданы
D:\build>build.exe -ip 10.1.10.1 -port 443 -wsp 3001 -dbg 1
10.1.10.1
443
3001
1
*/

Как видите, тема компактная, но весьма полезная. Go - это язык преимущественно бэкэнда, поэтому при запуске исполнимого файла, daemon`а или windows-службы параметры командной строки - это скорее правило, чем редкость.

Раунд!

PreviousФункцииNextЗавершение работы программы

Last updated 5 years ago

Was this helpful?