Переменная flag.ErrHelp

Переменная flag.ErrHelp - это предопределенная ошибка, которая возвращается парсером флагов в тех случаях, когда пользователь передает программе флаг -h или -help. Эта ошибка позволяет разработчикам обрабатывать запрос справки программно, а не полагаться на автоматический вывод, который выполняет функция flag.Parse. Первый параметр - это флаг, который мы проверяем, второй параметр - это значение ошибки, которую мы сравниваем с flag.ErrHelp.

Синтаксис

goflag.ErrHelp

Пример

Давайте рассмотрим пример программы, которая проверяет, был ли запрошен вывод справки:

gopackage 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. Однако мы можем переопределить это поведение:

gopackage 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:

go"Usage: ./program [options]"
"Options:"
"-name string"
"  name to greet (default World)"

Пример

Рассмотрим более сложный пример, где мы используем flag.ErrHelp для создания кастомной обработки справки с дополнительной информацией:

gopackage 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:

go"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,
    которая определяет вывод справки по умолчанию