Функция flag.VisitAll

Функция flag.VisitAll выполняет обход всех объявленных флагов командной строки. Она принимает один параметр — функцию обратного вызова, которая вызывается для каждого флага. Данная функция полезна для вывода информации о всех доступных флагах, их значений по умолчанию или для выполнения каких-либо действий с каждым флагом.

Синтаксис

goflag.VisitAll(fn func(*flag.Flag))

Пример

Давайте объявим несколько флагов разных типов и воспользуемся функцией flag.VisitAll для вывода их названий и значений:

gopackage main

import (
  "flag"
  "fmt"
)

func main() {
  name := flag.String("name", "Guest", "user name")
  age := flag.Int("age", 18, "user age")
  active := flag.Bool("active", false, "user active status")

  flag.Parse()

  flag.VisitAll(func(f *flag.Flag) {
    fmt.Printf("Flag: -%s, value: %s, default: %s\n", f.Name, f.Value.String(), f.DefValue)
  })
}

Результат выполнения кода:

go"Flag: -active, value: false, default: false"
"Flag: -age, value: 18, default: 18"
"Flag: -name, value: Guest, default: Guest"

Пример

Используем функцию flag.VisitAll для форматированного вывода справки по всем доступным флагам:

gopackage main

import (
  "flag"
  "fmt"
)

func main() {
  host := flag.String("host", "localhost", "server host")
  port := flag.Int("port", 8080, "server port")
  debug := flag.Bool("debug", false, "enable debug mode")

  flag.Parse()

  fmt.Println("Available flags:")
  flag.VisitAll(func(f *flag.Flag) {
    fmt.Printf("  -%s: %s (default: %s)\n", f.Name, f.Usage, f.DefValue)
  })
}

Результат выполнения кода:

go"Available flags:"
"  -debug: enable debug mode (default: false)"
"  -host: server host (default: localhost)"
"  -port: server port (default: 8080)"

Пример

Функция flag.VisitAll полезна для создания собственной справки или логирования всех переданных флагов в произвольном формате:

gopackage main

import (
  "flag"
  "fmt"
  "strings"
)

func main() {
  config := flag.String("config", "config.yaml", "path to config file")
  timeout := flag.Int("timeout", 30, "timeout in seconds")
  verbose := flag.Bool("verbose", false, "enable verbose output")

  flag.Parse()

  var flagsInfo []string
  flag.VisitAll(func(f *flag.Flag) {
    flagsInfo = append(flagsInfo, fmt.Sprintf("%s=%s", f.Name, f.Value.String()))
  })

  fmt.Printf("Flags: [%s]\n", strings.Join(flagsInfo, ", "))
}

Результат выполнения кода:

go"Flags: [config=config.yaml, timeout=30, verbose=false]"

Смотрите также

  • функцию flag.Visit,
    которая обходит только установленные флаги
  • функцию flag.Parse,
    которая выполняет разбор командной строки
  • функцию flag.PrintDefaults,
    которая выводит значения по умолчанию для всех флагов
  • структуру flag.FlagSet,
    которая позволяет создавать собственные наборы флагов