Home | History | Annotate | Download | only in flag
      1 // Copyright 2009 The Go Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style
      3 // license that can be found in the LICENSE file.
      4 
      5 /*
      6 	Package flag implements command-line flag parsing.
      7 
      8 	Usage:
      9 
     10 	Define flags using flag.String(), Bool(), Int(), etc.
     11 
     12 	This declares an integer flag, -flagname, stored in the pointer ip, with type *int.
     13 		import "flag"
     14 		var ip = flag.Int("flagname", 1234, "help message for flagname")
     15 	If you like, you can bind the flag to a variable using the Var() functions.
     16 		var flagvar int
     17 		func init() {
     18 			flag.IntVar(&flagvar, "flagname", 1234, "help message for flagname")
     19 		}
     20 	Or you can create custom flags that satisfy the Value interface (with
     21 	pointer receivers) and couple them to flag parsing by
     22 		flag.Var(&flagVal, "name", "help message for flagname")
     23 	For such flags, the default value is just the initial value of the variable.
     24 
     25 	After all flags are defined, call
     26 		flag.Parse()
     27 	to parse the command line into the defined flags.
     28 
     29 	Flags may then be used directly. If you're using the flags themselves,
     30 	they are all pointers; if you bind to variables, they're values.
     31 		fmt.Println("ip has value ", *ip)
     32 		fmt.Println("flagvar has value ", flagvar)
     33 
     34 	After parsing, the arguments following the flags are available as the
     35 	slice flag.Args() or individually as flag.Arg(i).
     36 	The arguments are indexed from 0 through flag.NArg()-1.
     37 
     38 	Command line flag syntax:
     39 		-flag
     40 		-flag=x
     41 		-flag x  // non-boolean flags only
     42 	One or two minus signs may be used; they are equivalent.
     43 	The last form is not permitted for boolean flags because the
     44 	meaning of the command
     45 		cmd -x *
     46 	will change if there is a file called 0, false, etc.  You must
     47 	use the -flag=false form to turn off a boolean flag.
     48 
     49 	Flag parsing stops just before the first non-flag argument
     50 	("-" is a non-flag argument) or after the terminator "--".
     51 
     52 	Integer flags accept 1234, 0664, 0x1234 and may be negative.
     53 	Boolean flags may be:
     54 		1, 0, t, f, T, F, true, false, TRUE, FALSE, True, False
     55 	Duration flags accept any input valid for time.ParseDuration.
     56 
     57 	The default set of command-line flags is controlled by
     58 	top-level functions.  The FlagSet type allows one to define
     59 	independent sets of flags, such as to implement subcommands
     60 	in a command-line interface. The methods of FlagSet are
     61 	analogous to the top-level functions for the command-line
     62 	flag set.
     63 */
     64 package flag
     65 
     66 import (
     67 	"errors"
     68 	"fmt"
     69 	"io"
     70 	"os"
     71 	"sort"
     72 	"strconv"
     73 	"time"
     74 )
     75 
     76 // ErrHelp is the error returned if the -help or -h flag is invoked
     77 // but no such flag is defined.
     78 var ErrHelp = errors.New("flag: help requested")
     79 
     80 // -- bool Value
     81 type boolValue bool
     82 
     83 func newBoolValue(val bool, p *bool) *boolValue {
     84 	*p = val
     85 	return (*boolValue)(p)
     86 }
     87 
     88 func (b *boolValue) Set(s string) error {
     89 	v, err := strconv.ParseBool(s)
     90 	*b = boolValue(v)
     91 	return err
     92 }
     93 
     94 func (b *boolValue) Get() interface{} { return bool(*b) }
     95 
     96 func (b *boolValue) String() string { return fmt.Sprintf("%v", *b) }
     97 
     98 func (b *boolValue) IsBoolFlag() bool { return true }
     99 
    100 // optional interface to indicate boolean flags that can be
    101 // supplied without "=value" text
    102 type boolFlag interface {
    103 	Value
    104 	IsBoolFlag() bool
    105 }
    106 
    107 // -- int Value
    108 type intValue int
    109 
    110 func newIntValue(val int, p *int) *intValue {
    111 	*p = val
    112 	return (*intValue)(p)
    113 }
    114 
    115 func (i *intValue) Set(s string) error {
    116 	v, err := strconv.ParseInt(s, 0, 64)
    117 	*i = intValue(v)
    118 	return err
    119 }
    120 
    121 func (i *intValue) Get() interface{} { return int(*i) }
    122 
    123 func (i *intValue) String() string { return fmt.Sprintf("%v", *i) }
    124 
    125 // -- int64 Value
    126 type int64Value int64
    127 
    128 func newInt64Value(val int64, p *int64) *int64Value {
    129 	*p = val
    130 	return (*int64Value)(p)
    131 }
    132 
    133 func (i *int64Value) Set(s string) error {
    134 	v, err := strconv.ParseInt(s, 0, 64)
    135 	*i = int64Value(v)
    136 	return err
    137 }
    138 
    139 func (i *int64Value) Get() interface{} { return int64(*i) }
    140 
    141 func (i *int64Value) String() string { return fmt.Sprintf("%v", *i) }
    142 
    143 // -- uint Value
    144 type uintValue uint
    145 
    146 func newUintValue(val uint, p *uint) *uintValue {
    147 	*p = val
    148 	return (*uintValue)(p)
    149 }
    150 
    151 func (i *uintValue) Set(s string) error {
    152 	v, err := strconv.ParseUint(s, 0, 64)
    153 	*i = uintValue(v)
    154 	return err
    155 }
    156 
    157 func (i *uintValue) Get() interface{} { return uint(*i) }
    158 
    159 func (i *uintValue) String() string { return fmt.Sprintf("%v", *i) }
    160 
    161 // -- uint64 Value
    162 type uint64Value uint64
    163 
    164 func newUint64Value(val uint64, p *uint64) *uint64Value {
    165 	*p = val
    166 	return (*uint64Value)(p)
    167 }
    168 
    169 func (i *uint64Value) Set(s string) error {
    170 	v, err := strconv.ParseUint(s, 0, 64)
    171 	*i = uint64Value(v)
    172 	return err
    173 }
    174 
    175 func (i *uint64Value) Get() interface{} { return uint64(*i) }
    176 
    177 func (i *uint64Value) String() string { return fmt.Sprintf("%v", *i) }
    178 
    179 // -- string Value
    180 type stringValue string
    181 
    182 func newStringValue(val string, p *string) *stringValue {
    183 	*p = val
    184 	return (*stringValue)(p)
    185 }
    186 
    187 func (s *stringValue) Set(val string) error {
    188 	*s = stringValue(val)
    189 	return nil
    190 }
    191 
    192 func (s *stringValue) Get() interface{} { return string(*s) }
    193 
    194 func (s *stringValue) String() string { return fmt.Sprintf("%s", *s) }
    195 
    196 // -- float64 Value
    197 type float64Value float64
    198 
    199 func newFloat64Value(val float64, p *float64) *float64Value {
    200 	*p = val
    201 	return (*float64Value)(p)
    202 }
    203 
    204 func (f *float64Value) Set(s string) error {
    205 	v, err := strconv.ParseFloat(s, 64)
    206 	*f = float64Value(v)
    207 	return err
    208 }
    209 
    210 func (f *float64Value) Get() interface{} { return float64(*f) }
    211 
    212 func (f *float64Value) String() string { return fmt.Sprintf("%v", *f) }
    213 
    214 // -- time.Duration Value
    215 type durationValue time.Duration
    216 
    217 func newDurationValue(val time.Duration, p *time.Duration) *durationValue {
    218 	*p = val
    219 	return (*durationValue)(p)
    220 }
    221 
    222 func (d *durationValue) Set(s string) error {
    223 	v, err := time.ParseDuration(s)
    224 	*d = durationValue(v)
    225 	return err
    226 }
    227 
    228 func (d *durationValue) Get() interface{} { return time.Duration(*d) }
    229 
    230 func (d *durationValue) String() string { return (*time.Duration)(d).String() }
    231 
    232 // Value is the interface to the dynamic value stored in a flag.
    233 // (The default value is represented as a string.)
    234 //
    235 // If a Value has an IsBoolFlag() bool method returning true,
    236 // the command-line parser makes -name equivalent to -name=true
    237 // rather than using the next command-line argument.
    238 //
    239 // Set is called once, in command line order, for each flag present.
    240 type Value interface {
    241 	String() string
    242 	Set(string) error
    243 }
    244 
    245 // Getter is an interface that allows the contents of a Value to be retrieved.
    246 // It wraps the Value interface, rather than being part of it, because it
    247 // appeared after Go 1 and its compatibility rules. All Value types provided
    248 // by this package satisfy the Getter interface.
    249 type Getter interface {
    250 	Value
    251 	Get() interface{}
    252 }
    253 
    254 // ErrorHandling defines how FlagSet.Parse behaves if the parse fails.
    255 type ErrorHandling int
    256 
    257 // These constants cause FlagSet.Parse to behave as described if the parse fails.
    258 const (
    259 	ContinueOnError ErrorHandling = iota // Return a descriptive error.
    260 	ExitOnError                          // Call os.Exit(2).
    261 	PanicOnError                         // Call panic with a descriptive error.
    262 )
    263 
    264 // A FlagSet represents a set of defined flags.  The zero value of a FlagSet
    265 // has no name and has ContinueOnError error handling.
    266 type FlagSet struct {
    267 	// Usage is the function called when an error occurs while parsing flags.
    268 	// The field is a function (not a method) that may be changed to point to
    269 	// a custom error handler.
    270 	Usage func()
    271 
    272 	name          string
    273 	parsed        bool
    274 	actual        map[string]*Flag
    275 	formal        map[string]*Flag
    276 	args          []string // arguments after flags
    277 	errorHandling ErrorHandling
    278 	output        io.Writer // nil means stderr; use out() accessor
    279 }
    280 
    281 // A Flag represents the state of a flag.
    282 type Flag struct {
    283 	Name     string // name as it appears on command line
    284 	Usage    string // help message
    285 	Value    Value  // value as set
    286 	DefValue string // default value (as text); for usage message
    287 }
    288 
    289 // sortFlags returns the flags as a slice in lexicographical sorted order.
    290 func sortFlags(flags map[string]*Flag) []*Flag {
    291 	list := make(sort.StringSlice, len(flags))
    292 	i := 0
    293 	for _, f := range flags {
    294 		list[i] = f.Name
    295 		i++
    296 	}
    297 	list.Sort()
    298 	result := make([]*Flag, len(list))
    299 	for i, name := range list {
    300 		result[i] = flags[name]
    301 	}
    302 	return result
    303 }
    304 
    305 func (f *FlagSet) out() io.Writer {
    306 	if f.output == nil {
    307 		return os.Stderr
    308 	}
    309 	return f.output
    310 }
    311 
    312 // SetOutput sets the destination for usage and error messages.
    313 // If output is nil, os.Stderr is used.
    314 func (f *FlagSet) SetOutput(output io.Writer) {
    315 	f.output = output
    316 }
    317 
    318 // VisitAll visits the flags in lexicographical order, calling fn for each.
    319 // It visits all flags, even those not set.
    320 func (f *FlagSet) VisitAll(fn func(*Flag)) {
    321 	for _, flag := range sortFlags(f.formal) {
    322 		fn(flag)
    323 	}
    324 }
    325 
    326 // VisitAll visits the command-line flags in lexicographical order, calling
    327 // fn for each.  It visits all flags, even those not set.
    328 func VisitAll(fn func(*Flag)) {
    329 	CommandLine.VisitAll(fn)
    330 }
    331 
    332 // Visit visits the flags in lexicographical order, calling fn for each.
    333 // It visits only those flags that have been set.
    334 func (f *FlagSet) Visit(fn func(*Flag)) {
    335 	for _, flag := range sortFlags(f.actual) {
    336 		fn(flag)
    337 	}
    338 }
    339 
    340 // Visit visits the command-line flags in lexicographical order, calling fn
    341 // for each.  It visits only those flags that have been set.
    342 func Visit(fn func(*Flag)) {
    343 	CommandLine.Visit(fn)
    344 }
    345 
    346 // Lookup returns the Flag structure of the named flag, returning nil if none exists.
    347 func (f *FlagSet) Lookup(name string) *Flag {
    348 	return f.formal[name]
    349 }
    350 
    351 // Lookup returns the Flag structure of the named command-line flag,
    352 // returning nil if none exists.
    353 func Lookup(name string) *Flag {
    354 	return CommandLine.formal[name]
    355 }
    356 
    357 // Set sets the value of the named flag.
    358 func (f *FlagSet) Set(name, value string) error {
    359 	flag, ok := f.formal[name]
    360 	if !ok {
    361 		return fmt.Errorf("no such flag -%v", name)
    362 	}
    363 	err := flag.Value.Set(value)
    364 	if err != nil {
    365 		return err
    366 	}
    367 	if f.actual == nil {
    368 		f.actual = make(map[string]*Flag)
    369 	}
    370 	f.actual[name] = flag
    371 	return nil
    372 }
    373 
    374 // Set sets the value of the named command-line flag.
    375 func Set(name, value string) error {
    376 	return CommandLine.Set(name, value)
    377 }
    378 
    379 // isZeroValue guesses whether the string represents the zero
    380 // value for a flag. It is not accurate but in practice works OK.
    381 func isZeroValue(value string) bool {
    382 	switch value {
    383 	case "false":
    384 		return true
    385 	case "":
    386 		return true
    387 	case "0":
    388 		return true
    389 	}
    390 	return false
    391 }
    392 
    393 // UnquoteUsage extracts a back-quoted name from the usage
    394 // string for a flag and returns it and the un-quoted usage.
    395 // Given "a `name` to show" it returns ("name", "a name to show").
    396 // If there are no back quotes, the name is an educated guess of the
    397 // type of the flag's value, or the empty string if the flag is boolean.
    398 func UnquoteUsage(flag *Flag) (name string, usage string) {
    399 	// Look for a back-quoted name, but avoid the strings package.
    400 	usage = flag.Usage
    401 	for i := 0; i < len(usage); i++ {
    402 		if usage[i] == '`' {
    403 			for j := i + 1; j < len(usage); j++ {
    404 				if usage[j] == '`' {
    405 					name = usage[i+1 : j]
    406 					usage = usage[:i] + name + usage[j+1:]
    407 					return name, usage
    408 				}
    409 			}
    410 			break // Only one back quote; use type name.
    411 		}
    412 	}
    413 	// No explicit name, so use type if we can find one.
    414 	name = "value"
    415 	switch flag.Value.(type) {
    416 	case boolFlag:
    417 		name = ""
    418 	case *durationValue:
    419 		name = "duration"
    420 	case *float64Value:
    421 		name = "float"
    422 	case *intValue, *int64Value:
    423 		name = "int"
    424 	case *stringValue:
    425 		name = "string"
    426 	case *uintValue, *uint64Value:
    427 		name = "uint"
    428 	}
    429 	return
    430 }
    431 
    432 // PrintDefaults prints to standard error the default values of all
    433 // defined command-line flags in the set. See the documentation for
    434 // the global function PrintDefaults for more information.
    435 func (f *FlagSet) PrintDefaults() {
    436 	f.VisitAll(func(flag *Flag) {
    437 		s := fmt.Sprintf("  -%s", flag.Name) // Two spaces before -; see next two comments.
    438 		name, usage := UnquoteUsage(flag)
    439 		if len(name) > 0 {
    440 			s += " " + name
    441 		}
    442 		// Boolean flags of one ASCII letter are so common we
    443 		// treat them specially, putting their usage on the same line.
    444 		if len(s) <= 4 { // space, space, '-', 'x'.
    445 			s += "\t"
    446 		} else {
    447 			// Four spaces before the tab triggers good alignment
    448 			// for both 4- and 8-space tab stops.
    449 			s += "\n    \t"
    450 		}
    451 		s += usage
    452 		if !isZeroValue(flag.DefValue) {
    453 			if _, ok := flag.Value.(*stringValue); ok {
    454 				// put quotes on the value
    455 				s += fmt.Sprintf(" (default %q)", flag.DefValue)
    456 			} else {
    457 				s += fmt.Sprintf(" (default %v)", flag.DefValue)
    458 			}
    459 		}
    460 		fmt.Fprint(f.out(), s, "\n")
    461 	})
    462 }
    463 
    464 // PrintDefaults prints, to standard error unless configured otherwise,
    465 // a usage message showing the default settings of all defined
    466 // command-line flags.
    467 // For an integer valued flag x, the default output has the form
    468 //	-x int
    469 //		usage-message-for-x (default 7)
    470 // The usage message will appear on a separate line for anything but
    471 // a bool flag with a one-byte name. For bool flags, the type is
    472 // omitted and if the flag name is one byte the usage message appears
    473 // on the same line. The parenthetical default is omitted if the
    474 // default is the zero value for the type. The listed type, here int,
    475 // can be changed by placing a back-quoted name in the flag's usage
    476 // string; the first such item in the message is taken to be a parameter
    477 // name to show in the message and the back quotes are stripped from
    478 // the message when displayed. For instance, given
    479 //	flag.String("I", "", "search `directory` for include files")
    480 // the output will be
    481 //	-I directory
    482 //		search directory for include files.
    483 func PrintDefaults() {
    484 	CommandLine.PrintDefaults()
    485 }
    486 
    487 // defaultUsage is the default function to print a usage message.
    488 func defaultUsage(f *FlagSet) {
    489 	if f.name == "" {
    490 		fmt.Fprintf(f.out(), "Usage:\n")
    491 	} else {
    492 		fmt.Fprintf(f.out(), "Usage of %s:\n", f.name)
    493 	}
    494 	f.PrintDefaults()
    495 }
    496 
    497 // NOTE: Usage is not just defaultUsage(CommandLine)
    498 // because it serves (via godoc flag Usage) as the example
    499 // for how to write your own usage function.
    500 
    501 // Usage prints to standard error a usage message documenting all defined command-line flags.
    502 // It is called when an error occurs while parsing flags.
    503 // The function is a variable that may be changed to point to a custom function.
    504 // By default it prints a simple header and calls PrintDefaults; for details about the
    505 // format of the output and how to control it, see the documentation for PrintDefaults.
    506 var Usage = func() {
    507 	fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0])
    508 	PrintDefaults()
    509 }
    510 
    511 // NFlag returns the number of flags that have been set.
    512 func (f *FlagSet) NFlag() int { return len(f.actual) }
    513 
    514 // NFlag returns the number of command-line flags that have been set.
    515 func NFlag() int { return len(CommandLine.actual) }
    516 
    517 // Arg returns the i'th argument.  Arg(0) is the first remaining argument
    518 // after flags have been processed. Arg returns an empty string if the
    519 // requested element does not exist.
    520 func (f *FlagSet) Arg(i int) string {
    521 	if i < 0 || i >= len(f.args) {
    522 		return ""
    523 	}
    524 	return f.args[i]
    525 }
    526 
    527 // Arg returns the i'th command-line argument.  Arg(0) is the first remaining argument
    528 // after flags have been processed. Arg returns an empty string if the
    529 // requested element does not exist.
    530 func Arg(i int) string {
    531 	return CommandLine.Arg(i)
    532 }
    533 
    534 // NArg is the number of arguments remaining after flags have been processed.
    535 func (f *FlagSet) NArg() int { return len(f.args) }
    536 
    537 // NArg is the number of arguments remaining after flags have been processed.
    538 func NArg() int { return len(CommandLine.args) }
    539 
    540 // Args returns the non-flag arguments.
    541 func (f *FlagSet) Args() []string { return f.args }
    542 
    543 // Args returns the non-flag command-line arguments.
    544 func Args() []string { return CommandLine.args }
    545 
    546 // BoolVar defines a bool flag with specified name, default value, and usage string.
    547 // The argument p points to a bool variable in which to store the value of the flag.
    548 func (f *FlagSet) BoolVar(p *bool, name string, value bool, usage string) {
    549 	f.Var(newBoolValue(value, p), name, usage)
    550 }
    551 
    552 // BoolVar defines a bool flag with specified name, default value, and usage string.
    553 // The argument p points to a bool variable in which to store the value of the flag.
    554 func BoolVar(p *bool, name string, value bool, usage string) {
    555 	CommandLine.Var(newBoolValue(value, p), name, usage)
    556 }
    557 
    558 // Bool defines a bool flag with specified name, default value, and usage string.
    559 // The return value is the address of a bool variable that stores the value of the flag.
    560 func (f *FlagSet) Bool(name string, value bool, usage string) *bool {
    561 	p := new(bool)
    562 	f.BoolVar(p, name, value, usage)
    563 	return p
    564 }
    565 
    566 // Bool defines a bool flag with specified name, default value, and usage string.
    567 // The return value is the address of a bool variable that stores the value of the flag.
    568 func Bool(name string, value bool, usage string) *bool {
    569 	return CommandLine.Bool(name, value, usage)
    570 }
    571 
    572 // IntVar defines an int flag with specified name, default value, and usage string.
    573 // The argument p points to an int variable in which to store the value of the flag.
    574 func (f *FlagSet) IntVar(p *int, name string, value int, usage string) {
    575 	f.Var(newIntValue(value, p), name, usage)
    576 }
    577 
    578 // IntVar defines an int flag with specified name, default value, and usage string.
    579 // The argument p points to an int variable in which to store the value of the flag.
    580 func IntVar(p *int, name string, value int, usage string) {
    581 	CommandLine.Var(newIntValue(value, p), name, usage)
    582 }
    583 
    584 // Int defines an int flag with specified name, default value, and usage string.
    585 // The return value is the address of an int variable that stores the value of the flag.
    586 func (f *FlagSet) Int(name string, value int, usage string) *int {
    587 	p := new(int)
    588 	f.IntVar(p, name, value, usage)
    589 	return p
    590 }
    591 
    592 // Int defines an int flag with specified name, default value, and usage string.
    593 // The return value is the address of an int variable that stores the value of the flag.
    594 func Int(name string, value int, usage string) *int {
    595 	return CommandLine.Int(name, value, usage)
    596 }
    597 
    598 // Int64Var defines an int64 flag with specified name, default value, and usage string.
    599 // The argument p points to an int64 variable in which to store the value of the flag.
    600 func (f *FlagSet) Int64Var(p *int64, name string, value int64, usage string) {
    601 	f.Var(newInt64Value(value, p), name, usage)
    602 }
    603 
    604 // Int64Var defines an int64 flag with specified name, default value, and usage string.
    605 // The argument p points to an int64 variable in which to store the value of the flag.
    606 func Int64Var(p *int64, name string, value int64, usage string) {
    607 	CommandLine.Var(newInt64Value(value, p), name, usage)
    608 }
    609 
    610 // Int64 defines an int64 flag with specified name, default value, and usage string.
    611 // The return value is the address of an int64 variable that stores the value of the flag.
    612 func (f *FlagSet) Int64(name string, value int64, usage string) *int64 {
    613 	p := new(int64)
    614 	f.Int64Var(p, name, value, usage)
    615 	return p
    616 }
    617 
    618 // Int64 defines an int64 flag with specified name, default value, and usage string.
    619 // The return value is the address of an int64 variable that stores the value of the flag.
    620 func Int64(name string, value int64, usage string) *int64 {
    621 	return CommandLine.Int64(name, value, usage)
    622 }
    623 
    624 // UintVar defines a uint flag with specified name, default value, and usage string.
    625 // The argument p points to a uint variable in which to store the value of the flag.
    626 func (f *FlagSet) UintVar(p *uint, name string, value uint, usage string) {
    627 	f.Var(newUintValue(value, p), name, usage)
    628 }
    629 
    630 // UintVar defines a uint flag with specified name, default value, and usage string.
    631 // The argument p points to a uint  variable in which to store the value of the flag.
    632 func UintVar(p *uint, name string, value uint, usage string) {
    633 	CommandLine.Var(newUintValue(value, p), name, usage)
    634 }
    635 
    636 // Uint defines a uint flag with specified name, default value, and usage string.
    637 // The return value is the address of a uint  variable that stores the value of the flag.
    638 func (f *FlagSet) Uint(name string, value uint, usage string) *uint {
    639 	p := new(uint)
    640 	f.UintVar(p, name, value, usage)
    641 	return p
    642 }
    643 
    644 // Uint defines a uint flag with specified name, default value, and usage string.
    645 // The return value is the address of a uint  variable that stores the value of the flag.
    646 func Uint(name string, value uint, usage string) *uint {
    647 	return CommandLine.Uint(name, value, usage)
    648 }
    649 
    650 // Uint64Var defines a uint64 flag with specified name, default value, and usage string.
    651 // The argument p points to a uint64 variable in which to store the value of the flag.
    652 func (f *FlagSet) Uint64Var(p *uint64, name string, value uint64, usage string) {
    653 	f.Var(newUint64Value(value, p), name, usage)
    654 }
    655 
    656 // Uint64Var defines a uint64 flag with specified name, default value, and usage string.
    657 // The argument p points to a uint64 variable in which to store the value of the flag.
    658 func Uint64Var(p *uint64, name string, value uint64, usage string) {
    659 	CommandLine.Var(newUint64Value(value, p), name, usage)
    660 }
    661 
    662 // Uint64 defines a uint64 flag with specified name, default value, and usage string.
    663 // The return value is the address of a uint64 variable that stores the value of the flag.
    664 func (f *FlagSet) Uint64(name string, value uint64, usage string) *uint64 {
    665 	p := new(uint64)
    666 	f.Uint64Var(p, name, value, usage)
    667 	return p
    668 }
    669 
    670 // Uint64 defines a uint64 flag with specified name, default value, and usage string.
    671 // The return value is the address of a uint64 variable that stores the value of the flag.
    672 func Uint64(name string, value uint64, usage string) *uint64 {
    673 	return CommandLine.Uint64(name, value, usage)
    674 }
    675 
    676 // StringVar defines a string flag with specified name, default value, and usage string.
    677 // The argument p points to a string variable in which to store the value of the flag.
    678 func (f *FlagSet) StringVar(p *string, name string, value string, usage string) {
    679 	f.Var(newStringValue(value, p), name, usage)
    680 }
    681 
    682 // StringVar defines a string flag with specified name, default value, and usage string.
    683 // The argument p points to a string variable in which to store the value of the flag.
    684 func StringVar(p *string, name string, value string, usage string) {
    685 	CommandLine.Var(newStringValue(value, p), name, usage)
    686 }
    687 
    688 // String defines a string flag with specified name, default value, and usage string.
    689 // The return value is the address of a string variable that stores the value of the flag.
    690 func (f *FlagSet) String(name string, value string, usage string) *string {
    691 	p := new(string)
    692 	f.StringVar(p, name, value, usage)
    693 	return p
    694 }
    695 
    696 // String defines a string flag with specified name, default value, and usage string.
    697 // The return value is the address of a string variable that stores the value of the flag.
    698 func String(name string, value string, usage string) *string {
    699 	return CommandLine.String(name, value, usage)
    700 }
    701 
    702 // Float64Var defines a float64 flag with specified name, default value, and usage string.
    703 // The argument p points to a float64 variable in which to store the value of the flag.
    704 func (f *FlagSet) Float64Var(p *float64, name string, value float64, usage string) {
    705 	f.Var(newFloat64Value(value, p), name, usage)
    706 }
    707 
    708 // Float64Var defines a float64 flag with specified name, default value, and usage string.
    709 // The argument p points to a float64 variable in which to store the value of the flag.
    710 func Float64Var(p *float64, name string, value float64, usage string) {
    711 	CommandLine.Var(newFloat64Value(value, p), name, usage)
    712 }
    713 
    714 // Float64 defines a float64 flag with specified name, default value, and usage string.
    715 // The return value is the address of a float64 variable that stores the value of the flag.
    716 func (f *FlagSet) Float64(name string, value float64, usage string) *float64 {
    717 	p := new(float64)
    718 	f.Float64Var(p, name, value, usage)
    719 	return p
    720 }
    721 
    722 // Float64 defines a float64 flag with specified name, default value, and usage string.
    723 // The return value is the address of a float64 variable that stores the value of the flag.
    724 func Float64(name string, value float64, usage string) *float64 {
    725 	return CommandLine.Float64(name, value, usage)
    726 }
    727 
    728 // DurationVar defines a time.Duration flag with specified name, default value, and usage string.
    729 // The argument p points to a time.Duration variable in which to store the value of the flag.
    730 // The flag accepts a value acceptable to time.ParseDuration.
    731 func (f *FlagSet) DurationVar(p *time.Duration, name string, value time.Duration, usage string) {
    732 	f.Var(newDurationValue(value, p), name, usage)
    733 }
    734 
    735 // DurationVar defines a time.Duration flag with specified name, default value, and usage string.
    736 // The argument p points to a time.Duration variable in which to store the value of the flag.
    737 // The flag accepts a value acceptable to time.ParseDuration.
    738 func DurationVar(p *time.Duration, name string, value time.Duration, usage string) {
    739 	CommandLine.Var(newDurationValue(value, p), name, usage)
    740 }
    741 
    742 // Duration defines a time.Duration flag with specified name, default value, and usage string.
    743 // The return value is the address of a time.Duration variable that stores the value of the flag.
    744 // The flag accepts a value acceptable to time.ParseDuration.
    745 func (f *FlagSet) Duration(name string, value time.Duration, usage string) *time.Duration {
    746 	p := new(time.Duration)
    747 	f.DurationVar(p, name, value, usage)
    748 	return p
    749 }
    750 
    751 // Duration defines a time.Duration flag with specified name, default value, and usage string.
    752 // The return value is the address of a time.Duration variable that stores the value of the flag.
    753 // The flag accepts a value acceptable to time.ParseDuration.
    754 func Duration(name string, value time.Duration, usage string) *time.Duration {
    755 	return CommandLine.Duration(name, value, usage)
    756 }
    757 
    758 // Var defines a flag with the specified name and usage string. The type and
    759 // value of the flag are represented by the first argument, of type Value, which
    760 // typically holds a user-defined implementation of Value. For instance, the
    761 // caller could create a flag that turns a comma-separated string into a slice
    762 // of strings by giving the slice the methods of Value; in particular, Set would
    763 // decompose the comma-separated string into the slice.
    764 func (f *FlagSet) Var(value Value, name string, usage string) {
    765 	// Remember the default value as a string; it won't change.
    766 	flag := &Flag{name, usage, value, value.String()}
    767 	_, alreadythere := f.formal[name]
    768 	if alreadythere {
    769 		var msg string
    770 		if f.name == "" {
    771 			msg = fmt.Sprintf("flag redefined: %s", name)
    772 		} else {
    773 			msg = fmt.Sprintf("%s flag redefined: %s", f.name, name)
    774 		}
    775 		fmt.Fprintln(f.out(), msg)
    776 		panic(msg) // Happens only if flags are declared with identical names
    777 	}
    778 	if f.formal == nil {
    779 		f.formal = make(map[string]*Flag)
    780 	}
    781 	f.formal[name] = flag
    782 }
    783 
    784 // Var defines a flag with the specified name and usage string. The type and
    785 // value of the flag are represented by the first argument, of type Value, which
    786 // typically holds a user-defined implementation of Value. For instance, the
    787 // caller could create a flag that turns a comma-separated string into a slice
    788 // of strings by giving the slice the methods of Value; in particular, Set would
    789 // decompose the comma-separated string into the slice.
    790 func Var(value Value, name string, usage string) {
    791 	CommandLine.Var(value, name, usage)
    792 }
    793 
    794 // failf prints to standard error a formatted error and usage message and
    795 // returns the error.
    796 func (f *FlagSet) failf(format string, a ...interface{}) error {
    797 	err := fmt.Errorf(format, a...)
    798 	fmt.Fprintln(f.out(), err)
    799 	f.usage()
    800 	return err
    801 }
    802 
    803 // usage calls the Usage method for the flag set if one is specified,
    804 // or the appropriate default usage function otherwise.
    805 func (f *FlagSet) usage() {
    806 	if f.Usage == nil {
    807 		if f == CommandLine {
    808 			Usage()
    809 		} else {
    810 			defaultUsage(f)
    811 		}
    812 	} else {
    813 		f.Usage()
    814 	}
    815 }
    816 
    817 // parseOne parses one flag. It reports whether a flag was seen.
    818 func (f *FlagSet) parseOne() (bool, error) {
    819 	if len(f.args) == 0 {
    820 		return false, nil
    821 	}
    822 	s := f.args[0]
    823 	if len(s) == 0 || s[0] != '-' || len(s) == 1 {
    824 		return false, nil
    825 	}
    826 	numMinuses := 1
    827 	if s[1] == '-' {
    828 		numMinuses++
    829 		if len(s) == 2 { // "--" terminates the flags
    830 			f.args = f.args[1:]
    831 			return false, nil
    832 		}
    833 	}
    834 	name := s[numMinuses:]
    835 	if len(name) == 0 || name[0] == '-' || name[0] == '=' {
    836 		return false, f.failf("bad flag syntax: %s", s)
    837 	}
    838 
    839 	// it's a flag. does it have an argument?
    840 	f.args = f.args[1:]
    841 	hasValue := false
    842 	value := ""
    843 	for i := 1; i < len(name); i++ { // equals cannot be first
    844 		if name[i] == '=' {
    845 			value = name[i+1:]
    846 			hasValue = true
    847 			name = name[0:i]
    848 			break
    849 		}
    850 	}
    851 	m := f.formal
    852 	flag, alreadythere := m[name] // BUG
    853 	if !alreadythere {
    854 		if name == "help" || name == "h" { // special case for nice help message.
    855 			f.usage()
    856 			return false, ErrHelp
    857 		}
    858 		return false, f.failf("flag provided but not defined: -%s", name)
    859 	}
    860 
    861 	if fv, ok := flag.Value.(boolFlag); ok && fv.IsBoolFlag() { // special case: doesn't need an arg
    862 		if hasValue {
    863 			if err := fv.Set(value); err != nil {
    864 				return false, f.failf("invalid boolean value %q for -%s: %v", value, name, err)
    865 			}
    866 		} else {
    867 			if err := fv.Set("true"); err != nil {
    868 				return false, f.failf("invalid boolean flag %s: %v", name, err)
    869 			}
    870 		}
    871 	} else {
    872 		// It must have a value, which might be the next argument.
    873 		if !hasValue && len(f.args) > 0 {
    874 			// value is the next arg
    875 			hasValue = true
    876 			value, f.args = f.args[0], f.args[1:]
    877 		}
    878 		if !hasValue {
    879 			return false, f.failf("flag needs an argument: -%s", name)
    880 		}
    881 		if err := flag.Value.Set(value); err != nil {
    882 			return false, f.failf("invalid value %q for flag -%s: %v", value, name, err)
    883 		}
    884 	}
    885 	if f.actual == nil {
    886 		f.actual = make(map[string]*Flag)
    887 	}
    888 	f.actual[name] = flag
    889 	return true, nil
    890 }
    891 
    892 // Parse parses flag definitions from the argument list, which should not
    893 // include the command name.  Must be called after all flags in the FlagSet
    894 // are defined and before flags are accessed by the program.
    895 // The return value will be ErrHelp if -help or -h were set but not defined.
    896 func (f *FlagSet) Parse(arguments []string) error {
    897 	f.parsed = true
    898 	f.args = arguments
    899 	for {
    900 		seen, err := f.parseOne()
    901 		if seen {
    902 			continue
    903 		}
    904 		if err == nil {
    905 			break
    906 		}
    907 		switch f.errorHandling {
    908 		case ContinueOnError:
    909 			return err
    910 		case ExitOnError:
    911 			os.Exit(2)
    912 		case PanicOnError:
    913 			panic(err)
    914 		}
    915 	}
    916 	return nil
    917 }
    918 
    919 // Parsed reports whether f.Parse has been called.
    920 func (f *FlagSet) Parsed() bool {
    921 	return f.parsed
    922 }
    923 
    924 // Parse parses the command-line flags from os.Args[1:].  Must be called
    925 // after all flags are defined and before flags are accessed by the program.
    926 func Parse() {
    927 	// Ignore errors; CommandLine is set for ExitOnError.
    928 	CommandLine.Parse(os.Args[1:])
    929 }
    930 
    931 // Parsed reports whether the command-line flags have been parsed.
    932 func Parsed() bool {
    933 	return CommandLine.Parsed()
    934 }
    935 
    936 // CommandLine is the default set of command-line flags, parsed from os.Args.
    937 // The top-level functions such as BoolVar, Arg, and so on are wrappers for the
    938 // methods of CommandLine.
    939 var CommandLine = NewFlagSet(os.Args[0], ExitOnError)
    940 
    941 // NewFlagSet returns a new, empty flag set with the specified name and
    942 // error handling property.
    943 func NewFlagSet(name string, errorHandling ErrorHandling) *FlagSet {
    944 	f := &FlagSet{
    945 		name:          name,
    946 		errorHandling: errorHandling,
    947 	}
    948 	return f
    949 }
    950 
    951 // Init sets the name and error handling property for a flag set.
    952 // By default, the zero FlagSet uses an empty name and the
    953 // ContinueOnError error handling policy.
    954 func (f *FlagSet) Init(name string, errorHandling ErrorHandling) {
    955 	f.name = name
    956 	f.errorHandling = errorHandling
    957 }
    958