Работа с параметрами командной строки
Движение приносит победу
Говоря на чистоту, у автора было велико желание (и логика повествования требует этого), после рассмотрения функций незамедлительно перейти к методам, которые есть разновидность функций. Но есть вопросы, которые требуют ответов. давайте же сейчас заполним один из таких пробелов в наших знаниях, а именно: разберёмся с параметрами командной строки и способами их обработки.
Фактически, инструментов для такой работы - два. Это переменная пакета 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-службы параметры командной строки - это скорее правило, чем редкость.
Раунд!
Last updated
Was this helpful?