Переменная flag.ErrHelp
Переменная flag.ErrHelp - это предопределенная ошибка,
которая возвращается парсером флагов в тех случаях, когда
пользователь передает программе флаг -h или -help.
Эта ошибка позволяет разработчикам обрабатывать запрос справки
программно, а не полагаться на автоматический вывод, который
выполняет функция flag.Parse. Первый параметр -
это флаг, который мы проверяем, второй параметр -
это значение ошибки, которую мы сравниваем с flag.ErrHelp.
Синтаксис
flag.ErrHelp
Пример
Давайте рассмотрим пример программы, которая проверяет, был ли запрошен вывод справки:
package main
import (
"flag"
"fmt"
)
func main() {
name := flag.String("name", "World", "name to greet")
flag.Parse()
if flag.Parsed() {
fmt.Printf("Hello, %s!\n", *name)
}
}
При запуске программы с флагом -h или -help,
функция flag.Parse вызовет автоматический вывод справки
и завершит программу с кодом 2. Однако мы можем переопределить
это поведение:
package main
import (
"flag"
"fmt"
"os"
)
func main() {
flag.Usage = func() {
fmt.Fprintf(os.Stderr, "Usage: %s [options]\n", os.Args[0])
fmt.Fprintf(os.Stderr, "Options:\n")
flag.PrintDefaults()
}
err := flag.CommandLine.Parse(os.Args[1:])
if err == flag.ErrHelp {
flag.Usage()
os.Exit(0)
}
if err != nil {
fmt.Fprintf(os.Stderr, "Error parsing flags: %v\n", err)
os.Exit(1)
}
fmt.Println("Program started successfully")
}
Результат выполнения программы с флагом -h:
"Usage: ./program [options]"
"Options:"
"-name string"
" name to greet (default World)"
Пример
Рассмотрим более сложный пример, где мы используем
flag.ErrHelp для создания кастомной обработки справки
с дополнительной информацией:
package main
import (
"flag"
"fmt"
"os"
)
func main() {
var port int
var host string
var verbose bool
flag.IntVar(&port, "port", 8080, "server port")
flag.StringVar(&host, "host", "localhost", "server host")
flag.BoolVar(&verbose, "v", false, "verbose output")
flag.Usage = func() {
w := flag.CommandLine.Output()
fmt.Fprintf(w, "Custom help for %s\n", os.Args[0])
fmt.Fprintf(w, "Example: %s -host=127.0.0.1 -port=9090 -v\n\n", os.Args[0])
fmt.Fprintf(w, "Flags:\n")
flag.PrintDefaults()
fmt.Fprintf(w, "\nEnvironment variables:\n")
fmt.Fprintf(w, " PORT - overrides -port flag\n")
fmt.Fprintf(w, " HOST - overrides -host flag\n")
}
err := flag.CommandLine.Parse(os.Args[1:])
if err == flag.ErrHelp {
flag.Usage()
os.Exit(0)
}
if err != nil {
fmt.Fprintf(os.Stderr, "Error: %v\n", err)
os.Exit(1)
}
fmt.Printf("Server configuration: host=%s, port=%d, verbose=%v\n",
host, port, verbose)
}
Результат выполнения программы с флагом -help:
"Custom help for ./program"
"Example: ./program -host=127.0.0.1 -port=9090 -v"
""
"Flags:"
"-host string"
" server host (default localhost)"
"-port int"
" server port (default 8080)"
"-v verbose output"
""
"Environment variables:"
" PORT - overrides -port flag"
" HOST - overrides -host flag"
Смотрите также
-
переменную
flag.CommandLine,
которая представляет стандартный набор флагов -
функцию
flag.Parse,
которая разбирает переданные аргументы командной строки -
функцию
flag.Parsed,
которая проверяет, были ли разобраны флаги -
переменную
flag.Usage,
которая определяет вывод справки по умолчанию