Функция flag.Visit
Функция flag.Visit предназначена для итерации по флагам,
которые были явно установлены в командной строке.
Она принимает один аргумент — функцию обратного вызова,
которая будет вызвана для каждого установленного флага.
Эта функция принимает аргумент типа *flag.Flag,
содержащий информацию о флаге (его имя, значение и использование).
В отличие от flag.VisitAll, которая обходит все
определенные флаги (включая неустановленные), функция
flag.Visit обрабатывает только те флаги,
которые были указаны пользователем в командной строке.
Синтаксис
flag.Visit(fn func(*flag.Flag))
Параметр fn — это пользовательская функция,
которая получает указатель на структуру flag.Flag
для каждого установленного флага.
Пример
Давайте рассмотрим программу, которая определяет флаги
name и age, а затем с помощью
flag.Visit выводит только те флаги,
которые были указаны пользователем:
package 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:
Visited flags:
Flag: age, Value: 25
Flag: name, Value: john
Обратите внимание, что порядок вывода может отличаться, так как обход происходит в произвольном порядке.
Пример
Если пользователь указал только один флаг, то функция
flag.Visit вызовет колбэк только для него.
Запустим программу с флагом -name=alice:
package 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)
})
}
Результат выполнения:
Visited: name = alice
Флаг age не был указан, поэтому он не попал в обход.
Пример
Если программа запущена без аргументов командной строки,
функция flag.Visit не вызовет колбэк ни разу,
так как ни один флаг не был установлен:
package 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")
}
Результат выполнения:
No flags visited
Смотрите также
-
функцию
flag.VisitAll,
которая обходит все определенные флаги -
функцию
flag.Parse,
которая разбирает аргументы командной строки -
функцию
flag.StringVar,
которая привязывает строковый флаг к переменной -
функцию
flag.Lookup,
которая возвращает флаг по имени