Command Line Flags

Командний Рядок - Перемикачі|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:
...

# Далі, ми розглядемо змінні середовища, інший
# загальноприйнятий метод передачі параметрів програмам.