Функция flag.Usage
Функция flag.Usage представляет собой переменную типа
func(), которая вызывается при выводе справки по
флагам командной строки. По умолчанию она выводит список
всех зарегистрированных флагов с их описаниями и значениями
по умолчанию. Переопределяя flag.Usage, вы можете
полностью контролировать формат и содержание сообщения
справки, которое будет показано пользователю.
Синтаксис
flag.Usage = func() {
// пользовательский вывод справки
}
Пример
Давайте переопределим стандартную справку для программы,
принимающей флаги -name и -age:
package main
import (
"flag"
"fmt"
"os"
)
func main() {
var name string
var age int
flag.StringVar(&name, "name", "", "user name")
flag.IntVar(&age, "age", 0, "user age")
flag.Usage = func() {
fmt.Fprintf(os.Stderr, "Usage: %s [options]\n", os.Args[0])
fmt.Fprintf(os.Stderr, "Options:\n")
fmt.Fprintf(os.Stderr, " -name string\n")
fmt.Fprintf(os.Stderr, " user name\n")
fmt.Fprintf(os.Stderr, " -age int\n")
fmt.Fprintf(os.Stderr, " user age\n")
}
flag.Parse()
if name == "" {
fmt.Println("Name not provided")
} else {
fmt.Printf("Name: %s\n", name)
}
if age == 0 {
fmt.Println("Age not provided")
} else {
fmt.Printf("Age: %d\n", age)
}
}
Запустим программу с флагом -help или без
обязательных аргументов:
"Usage: ./program [options]"
"Options:"
" -name string"
" user name"
" -age int"
" user age"
Пример
Создадим более сложную справку с группировкой флагов и примерами использования:
package main
import (
"flag"
"fmt"
"os"
)
func main() {
var host string
var port int
var verbose bool
flag.StringVar(&host, "host", "localhost", "server host")
flag.IntVar(&port, "port", 8080, "server port")
flag.BoolVar(&verbose, "v", false, "verbose output")
flag.Usage = func() {
fmt.Fprintf(os.Stderr, "Usage: %s [options]\n", os.Args[0])
fmt.Fprintf(os.Stderr, "\nNetwork options:\n")
fmt.Fprintf(os.Stderr, " -host string\n")
fmt.Fprintf(os.Stderr, " server host (default \"localhost\")\n")
fmt.Fprintf(os.Stderr, " -port int\n")
fmt.Fprintf(os.Stderr, " server port (default 8080)\n")
fmt.Fprintf(os.Stderr, "\nBehavior options:\n")
fmt.Fprintf(os.Stderr, " -v\n")
fmt.Fprintf(os.Stderr, " enable verbose logging\n")
fmt.Fprintf(os.Stderr, "\nExamples:\n")
fmt.Fprintf(os.Stderr, " %s -host 0.0.0.0 -port 9090\n", os.Args[0])
fmt.Fprintf(os.Stderr, " %s -host 127.0.0.1 -v\n", os.Args[0])
}
flag.Parse()
fmt.Printf("Host: %s\n", host)
fmt.Printf("Port: %d\n", port)
fmt.Printf("Verbose: %t\n", verbose)
}
Результат выполнения программы при вызове с -help:
"Usage: ./program [options]"
""
"Network options:"
" -host string"
" server host (default \"localhost\")"
" -port int"
" server port (default 8080)"
""
"Behavior options:"
" -v"
" enable verbose logging"
""
"Examples:"
" ./program -host 0.0.0.0 -port 9090"
" ./program -host 127.0.0.1 -v"
Пример
Используем стандартную функцию flag.PrintDefaults
вместе с кастомным выводом:
package main
import (
"flag"
"fmt"
"os"
)
func main() {
var dir string
var timeout int
flag.StringVar(&dir, "dir", ".", "working directory")
flag.IntVar(&timeout, "timeout", 30, "timeout in seconds")
flag.Usage = func() {
fmt.Fprintf(os.Stderr, "Custom help for %s:\n", os.Args[0])
fmt.Fprintf(os.Stderr, "\nAvailable flags:\n")
flag.PrintDefaults()
fmt.Fprintf(os.Stderr, "\nFor more help, run: %s -help\n", os.Args[0])
}
flag.Parse()
fmt.Printf("Directory: %s\n", dir)
fmt.Printf("Timeout: %d\n", timeout)
}
Результат выполнения программы:
"Custom help for ./program:"
""
"Available flags:"
" -dir string"
" working directory (default \".\")"
" -timeout int"
" timeout in seconds (default 30)"
""
"For more help, run: ./program -help"
Смотрите также
-
функцию
flag.Parse,
которая разбирает флаги командной строки -
функцию
flag.PrintDefaults,
которая выводит стандартную справку по флагам -
функцию
flag.String,
которая объявляет строковый флаг -
функцию
flag.Int,
которая объявляет целочисленный флаг