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, используя подход, аналогичный флагу word.

    numbPtr := flag.Int("numb", 42, "an int")
    forkPtr := 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:", *forkPtr)
    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 для получения автоматически сгенерированной справки по программе.

$ ./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

Если указать флаг, который не был определён в пакете flag, программа выведет сообщение об ошибке и снова покажет текст справки.

$ ./command-line-flags -wat
flag provided but not defined: -wat
Usage of ./command-line-flags:
...

Далее: .