Функция flag.Visit

Функция flag.Visit предназначена для итерации по флагам, которые были явно установлены в командной строке. Она принимает один аргумент — функцию обратного вызова, которая будет вызвана для каждого установленного флага. Эта функция принимает аргумент типа *flag.Flag, содержащий информацию о флаге (его имя, значение и использование).

В отличие от flag.VisitAll, которая обходит все определенные флаги (включая неустановленные), функция flag.Visit обрабатывает только те флаги, которые были указаны пользователем в командной строке.

Синтаксис

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

Параметр fn — это пользовательская функция, которая получает указатель на структуру flag.Flag для каждого установленного флага.

Пример

Давайте рассмотрим программу, которая определяет флаги name и age, а затем с помощью flag.Visit выводит только те флаги, которые были указаны пользователем:

gopackage main

import (
  "flag"
  "fmt"
)

func main() {
  name := flag.String("name", "anonymous", "your name")
  age := flag.Int("age", 0, "your age")
  flag.Parse()

  fmt.Println("Visited flags:")
  flag.Visit(func(f *flag.Flag) {
    fmt.Printf("Flag: %s, Value: %s\n", f.Name, f.Value)
  })
}

Результат выполнения с аргументами -name=john -age=25:

goVisited flags:
Flag: age, Value: 25
Flag: name, Value: john

Обратите внимание, что порядок вывода может отличаться, так как обход происходит в произвольном порядке.

Пример

Если пользователь указал только один флаг, то функция flag.Visit вызовет колбэк только для него. Запустим программу с флагом -name=alice:

gopackage main

import (
  "flag"
  "fmt"
)

func main() {
  name := flag.String("name", "anonymous", "your name")
  age := flag.Int("age", 0, "your age")
  flag.Parse()

  flag.Visit(func(f *flag.Flag) {
    fmt.Printf("Visited: %s = %s\n", f.Name, f.Value)
  })
}

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

goVisited: name = alice

Флаг age не был указан, поэтому он не попал в обход.

Пример

Если программа запущена без аргументов командной строки, функция flag.Visit не вызовет колбэк ни разу, так как ни один флаг не был установлен:

gopackage main

import (
  "flag"
  "fmt"
)

func main() {
  name := flag.String("name", "anonymous", "your name")
  age := flag.Int("age", 0, "your age")
  flag.Parse()

  flag.Visit(func(f *flag.Flag) {
    fmt.Printf("Visited: %s = %s\n", f.Name, f.Value)
  })
  fmt.Println("No flags visited")
}

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

goNo flags visited

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

  • функцию flag.VisitAll,
    которая обходит все определенные флаги
  • функцию flag.Parse,
    которая разбирает аргументы командной строки
  • функцию flag.StringVar,
    которая привязывает строковый флаг к переменной
  • функцию flag.Lookup,
    которая возвращает флаг по имени