Функция flag.Usage

Функция flag.Usage представляет собой переменную типа func(), которая вызывается при выводе справки по флагам командной строки. По умолчанию она выводит список всех зарегистрированных флагов с их описаниями и значениями по умолчанию. Переопределяя flag.Usage, вы можете полностью контролировать формат и содержание сообщения справки, которое будет показано пользователю.

Синтаксис

goflag.Usage = func() {
  // пользовательский вывод справки
}

Пример

Давайте переопределим стандартную справку для программы, принимающей флаги -name и -age:

gopackage 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 или без обязательных аргументов:

go"Usage: ./program [options]"
"Options:"
"  -name string"
"  user name"
"  -age int"
"  user age"

Пример

Создадим более сложную справку с группировкой флагов и примерами использования:

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

go"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 вместе с кастомным выводом:

gopackage 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)
}

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

go"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,
    которая объявляет целочисленный флаг