> For the complete documentation index, see [llms.txt](https://docs.golang.org.ua/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.golang.org.ua/rabota-s-parametrami-komandnoi-stroki.md).

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

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

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

## os.Args

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

```go
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\`а:

```go
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**:

```go
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-службы параметры командной строки - это скорее правило, чем редкость.

#### Раунд!
