Go за Прикладом: Командний Рядок - Перемикачі

Прапори командного рядку - це загально прийнятий спосіб вказувати налаштування програмам призначеним для використання з командного рядка. Наприклад, у 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:
...

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

Наступний приклад: Командний Рядок - Під Команди.