Командний Рядок - Перемикачі|Command-Line Flags
#
// [_Прапори командного рядку_](https://uk.wikipedia.org/wiki/Інтерфейс_командного_рядка#Формат_команди) -
// це загально прийнятий спосіб вказувати налаштування програмам
// призначеним для використання з командного рядка. Наприклад,
// у `wc -l` прапорцем є `-l`
package main
// Пакет Go `flag` підтримує основні операції
// розбору прапорців командного рядку.
// Ми скористаємось ним, для створення власної консольної програми.
import (
"flag"
"fmt"
)
func main() {
// Декларування прапорців доступно для наступних типів даних -
// рядки, цілі числа та логічний тип даних. Ми декларуємо
// прапорець `word` з значенням за замовчуванням `"foo"`
// та короткою довідкою. Функція `flag.String`
// поверне вказівник на рядок, а не рядкову змінну, ми ще
// побачимо як користуватись таким вказівниками в майбутньому.
wordPtr := flag.String("word", "foo", "a string")
// Тут ми декларуємо прапорці `numb` та `fork`
// скориставшись вже знайомим підходом.
numbPtr := flag.Int("numb", 42, "an int")
boolPtr := flag.Bool("fork", false, "a bool")
// Також, можливо декларувати прапорець - таким чином
// щоб вже існуюча змінна прийняла на себе його значення.
// Зауважте, що потрібно передати вказівник на цю змінну
// аргументом до функції яка декларуватиме прапорець.
var svar string
flag.StringVar(&svar, "svar", "bar", "a string var")
// Як тільки усі прапорці задекларовані, ми викличемо `flag.Parse()`
// для виконання аналізу прапорців командного рядку.
flag.Parse()
// Наразі, ми просто виведемо на екран усі розпізнані налаштування
// та позиційні аргументи. Зауважте, що нам потрібно розіменувати
// вказівники, наприклад `*wordPtr`, щоб отримати справжнє його
// значення.
fmt.Println("word:", *wordPtr)
fmt.Println("numb:", *numbPtr)
fmt.Println("fork:", *boolPtr)
fmt.Println("svar:", svar)
fmt.Println("tail:", flag.Args())
}
# Щоб проексперементувати з прапорцями командного рядку,
# краще всього спершу скомпілювати нашу програму і вже
# потім запускати збудований файл напряму.
$ go build command-line-flags.go
# Спробуйте спершу скомпільовану програму - надавши
# значення усім прапорцям.
$ ./command-line-flags -word=opt -numb=7 -fork -svar=flag
word: opt
numb: 7
fork: true
svar: flag
tail: []
# Зауважте, що якщо ви пропустите прапорці, вони
# автоматично приймуть свої налаштування за замовчуванням.
$ ./command-line-flags -word=opt
word: opt
numb: 42
fork: false
svar: bar
tail: []
# Заключні або позиційні аргументи можуть бути вказані
# після будь-яких прапорців.
$ ./command-line-flags -word=opt a1 a2 a3
word: opt
...
tail: [a1 a2 a3]
# Зауваже що пакет `flag` потребує наявності усіх
# прапорців до позиційних аргументів (інакше прапорці
# будуть розпізнані як позиційні елементи).
$ ./command-line-flags -word=opt a1 a2 a3 -numb=7
word: opt
numb: 42
fork: false
svar: bar
tail: [a1 a2 a3 -numb=7]
# Скористайтесь прапорцями `-h` або `--help` щоб отримати
# автоматично згенеровану довідку по роботі з команднним
# рядком програми (якщо було використано пакет `flags`).
$ ./command-line-flags -h
Usage of ./command-line-flags:
-fork=false: a bool
-numb=42: an int
-svar="bar": a string var
-word="foo": a string
# Якщо ви вкажете прапорець, який не було вказано в нашій
# програмі, у відповідь, ви отримаєте повідомлення помилки
# та (повторно) тест довідки.
$ ./command-line-flags -wat
flag provided but not defined: -wat
Usage of ./command-line-flags:
...
# Далі, ми розглядемо змінні середовища, інший
# загальноприйнятий метод передачі параметрів програмам.