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.
6 Package flag implements command-line flag parsing.
10 Define flags using flag.String(), Bool(), Int(), etc.
12 This declares an integer flag, -flagname, stored in the pointer ip, with type *int.
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.
18 flag.IntVar(&flagvar, "flagname", 1234, "help message for flagname")
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.
25 After all flags are defined, call
27 to parse the command line into the defined flags.
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)
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.
38 Command line flag syntax:
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
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.
49 Flag parsing stops just before the first non-flag argument
50 ("-" is a non-flag argument) or after the terminator "--".
52 Integer flags accept 1234, 0664, 0x1234 and may be negative.
54 1, 0, t, f, T, F, true, false, TRUE, FALSE, True, False
55 Duration flags accept any input valid for time.ParseDuration.
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
77 // ErrHelp is the error returned if the -help or -h flag is invoked
78 // but no such flag is defined.
79 var ErrHelp
= errors
.New("flag: help requested")
84 func newBoolValue(val
bool, p
*bool) *boolValue
{
86 return (*boolValue
)(p
)
89 func (b
*boolValue
) Set(s
string) error
{
90 v
, err
:= strconv
.ParseBool(s
)
95 func (b
*boolValue
) Get() interface{} { return bool(*b
) }
97 func (b
*boolValue
) String() string { return strconv
.FormatBool(bool(*b
)) }
99 func (b
*boolValue
) IsBoolFlag() bool { return true }
101 // optional interface to indicate boolean flags that can be
102 // supplied without "=value" text
103 type boolFlag
interface {
111 func newIntValue(val
int, p
*int) *intValue
{
113 return (*intValue
)(p
)
116 func (i
*intValue
) Set(s
string) error
{
117 v
, err
:= strconv
.ParseInt(s
, 0, 64)
122 func (i
*intValue
) Get() interface{} { return int(*i
) }
124 func (i
*intValue
) String() string { return strconv
.Itoa(int(*i
)) }
127 type int64Value
int64
129 func newInt64Value(val
int64, p
*int64) *int64Value
{
131 return (*int64Value
)(p
)
134 func (i
*int64Value
) Set(s
string) error
{
135 v
, err
:= strconv
.ParseInt(s
, 0, 64)
140 func (i
*int64Value
) Get() interface{} { return int64(*i
) }
142 func (i
*int64Value
) String() string { return strconv
.FormatInt(int64(*i
), 10) }
147 func newUintValue(val
uint, p
*uint) *uintValue
{
149 return (*uintValue
)(p
)
152 func (i
*uintValue
) Set(s
string) error
{
153 v
, err
:= strconv
.ParseUint(s
, 0, 64)
158 func (i
*uintValue
) Get() interface{} { return uint(*i
) }
160 func (i
*uintValue
) String() string { return strconv
.FormatUint(uint64(*i
), 10) }
163 type uint64Value
uint64
165 func newUint64Value(val
uint64, p
*uint64) *uint64Value
{
167 return (*uint64Value
)(p
)
170 func (i
*uint64Value
) Set(s
string) error
{
171 v
, err
:= strconv
.ParseUint(s
, 0, 64)
176 func (i
*uint64Value
) Get() interface{} { return uint64(*i
) }
178 func (i
*uint64Value
) String() string { return strconv
.FormatUint(uint64(*i
), 10) }
181 type stringValue
string
183 func newStringValue(val
string, p
*string) *stringValue
{
185 return (*stringValue
)(p
)
188 func (s
*stringValue
) Set(val
string) error
{
189 *s
= stringValue(val
)
193 func (s
*stringValue
) Get() interface{} { return string(*s
) }
195 func (s
*stringValue
) String() string { return string(*s
) }
198 type float64Value
float64
200 func newFloat64Value(val
float64, p
*float64) *float64Value
{
202 return (*float64Value
)(p
)
205 func (f
*float64Value
) Set(s
string) error
{
206 v
, err
:= strconv
.ParseFloat(s
, 64)
211 func (f
*float64Value
) Get() interface{} { return float64(*f
) }
213 func (f
*float64Value
) String() string { return strconv
.FormatFloat(float64(*f
), 'g', -1, 64) }
215 // -- time.Duration Value
216 type durationValue time
.Duration
218 func newDurationValue(val time
.Duration
, p
*time
.Duration
) *durationValue
{
220 return (*durationValue
)(p
)
223 func (d
*durationValue
) Set(s
string) error
{
224 v
, err
:= time
.ParseDuration(s
)
225 *d
= durationValue(v
)
229 func (d
*durationValue
) Get() interface{} { return time
.Duration(*d
) }
231 func (d
*durationValue
) String() string { return (*time
.Duration
)(d
).String() }
233 // Value is the interface to the dynamic value stored in a flag.
234 // (The default value is represented as a string.)
236 // If a Value has an IsBoolFlag() bool method returning true,
237 // the command-line parser makes -name equivalent to -name=true
238 // rather than using the next command-line argument.
240 // Set is called once, in command line order, for each flag present.
241 // The flag package may call the String method with a zero-valued receiver,
242 // such as a nil pointer.
243 type Value
interface {
248 // Getter is an interface that allows the contents of a Value to be retrieved.
249 // It wraps the Value interface, rather than being part of it, because it
250 // appeared after Go 1 and its compatibility rules. All Value types provided
251 // by this package satisfy the Getter interface.
252 type Getter
interface {
257 // ErrorHandling defines how FlagSet.Parse behaves if the parse fails.
258 type ErrorHandling
int
260 // These constants cause FlagSet.Parse to behave as described if the parse fails.
262 ContinueOnError ErrorHandling
= iota // Return a descriptive error.
263 ExitOnError
// Call os.Exit(2).
264 PanicOnError
// Call panic with a descriptive error.
267 // A FlagSet represents a set of defined flags. The zero value of a FlagSet
268 // has no name and has ContinueOnError error handling.
269 type FlagSet
struct {
270 // Usage is the function called when an error occurs while parsing flags.
271 // The field is a function (not a method) that may be changed to point to
272 // a custom error handler.
277 actual
map[string]*Flag
278 formal
map[string]*Flag
279 args
[]string // arguments after flags
280 errorHandling ErrorHandling
281 output io
.Writer
// nil means stderr; use out() accessor
284 // A Flag represents the state of a flag.
286 Name
string // name as it appears on command line
287 Usage
string // help message
288 Value Value
// value as set
289 DefValue
string // default value (as text); for usage message
292 // sortFlags returns the flags as a slice in lexicographical sorted order.
293 func sortFlags(flags
map[string]*Flag
) []*Flag
{
294 list
:= make(sort
.StringSlice
, len(flags
))
296 for _
, f
:= range flags
{
301 result
:= make([]*Flag
, len(list
))
302 for i
, name
:= range list
{
303 result
[i
] = flags
[name
]
308 func (f
*FlagSet
) out() io
.Writer
{
315 // SetOutput sets the destination for usage and error messages.
316 // If output is nil, os.Stderr is used.
317 func (f
*FlagSet
) SetOutput(output io
.Writer
) {
321 // VisitAll visits the flags in lexicographical order, calling fn for each.
322 // It visits all flags, even those not set.
323 func (f
*FlagSet
) VisitAll(fn
func(*Flag
)) {
324 for _
, flag
:= range sortFlags(f
.formal
) {
329 // VisitAll visits the command-line flags in lexicographical order, calling
330 // fn for each. It visits all flags, even those not set.
331 func VisitAll(fn
func(*Flag
)) {
332 CommandLine
.VisitAll(fn
)
335 // Visit visits the flags in lexicographical order, calling fn for each.
336 // It visits only those flags that have been set.
337 func (f
*FlagSet
) Visit(fn
func(*Flag
)) {
338 for _
, flag
:= range sortFlags(f
.actual
) {
343 // Visit visits the command-line flags in lexicographical order, calling fn
344 // for each. It visits only those flags that have been set.
345 func Visit(fn
func(*Flag
)) {
346 CommandLine
.Visit(fn
)
349 // Lookup returns the Flag structure of the named flag, returning nil if none exists.
350 func (f
*FlagSet
) Lookup(name
string) *Flag
{
351 return f
.formal
[name
]
354 // Lookup returns the Flag structure of the named command-line flag,
355 // returning nil if none exists.
356 func Lookup(name
string) *Flag
{
357 return CommandLine
.formal
[name
]
360 // Set sets the value of the named flag.
361 func (f
*FlagSet
) Set(name
, value
string) error
{
362 flag
, ok
:= f
.formal
[name
]
364 return fmt
.Errorf("no such flag -%v", name
)
366 err
:= flag
.Value
.Set(value
)
371 f
.actual
= make(map[string]*Flag
)
373 f
.actual
[name
] = flag
377 // Set sets the value of the named command-line flag.
378 func Set(name
, value
string) error
{
379 return CommandLine
.Set(name
, value
)
382 // isZeroValue guesses whether the string represents the zero
383 // value for a flag. It is not accurate but in practice works OK.
384 func isZeroValue(flag
*Flag
, value
string) bool {
385 // Build a zero value of the flag's Value type, and see if the
386 // result of calling its String method equals the value passed in.
387 // This works unless the Value type is itself an interface type.
388 typ
:= reflect
.TypeOf(flag
.Value
)
390 if typ
.Kind() == reflect
.Ptr
{
391 z
= reflect
.New(typ
.Elem())
393 z
= reflect
.Zero(typ
)
395 if value
== z
.Interface().(Value
).String() {
410 // UnquoteUsage extracts a back-quoted name from the usage
411 // string for a flag and returns it and the un-quoted usage.
412 // Given "a `name` to show" it returns ("name", "a name to show").
413 // If there are no back quotes, the name is an educated guess of the
414 // type of the flag's value, or the empty string if the flag is boolean.
415 func UnquoteUsage(flag
*Flag
) (name
string, usage
string) {
416 // Look for a back-quoted name, but avoid the strings package.
418 for i
:= 0; i
< len(usage
); i
++ {
420 for j
:= i
+ 1; j
< len(usage
); j
++ {
422 name
= usage
[i
+1 : j
]
423 usage
= usage
[:i
] + name
+ usage
[j
+1:]
427 break // Only one back quote; use type name.
430 // No explicit name, so use type if we can find one.
432 switch flag
.Value
.(type) {
439 case *intValue
, *int64Value
:
443 case *uintValue
, *uint64Value
:
449 // PrintDefaults prints to standard error the default values of all
450 // defined command-line flags in the set. See the documentation for
451 // the global function PrintDefaults for more information.
452 func (f
*FlagSet
) PrintDefaults() {
453 f
.VisitAll(func(flag
*Flag
) {
454 s
:= fmt
.Sprintf(" -%s", flag
.Name
) // Two spaces before -; see next two comments.
455 name
, usage
:= UnquoteUsage(flag
)
459 // Boolean flags of one ASCII letter are so common we
460 // treat them specially, putting their usage on the same line.
461 if len(s
) <= 4 { // space, space, '-', 'x'.
464 // Four spaces before the tab triggers good alignment
465 // for both 4- and 8-space tab stops.
469 if !isZeroValue(flag
, flag
.DefValue
) {
470 if _
, ok
:= flag
.Value
.(*stringValue
); ok
{
471 // put quotes on the value
472 s
+= fmt
.Sprintf(" (default %q)", flag
.DefValue
)
474 s
+= fmt
.Sprintf(" (default %v)", flag
.DefValue
)
477 fmt
.Fprint(f
.out(), s
, "\n")
481 // PrintDefaults prints, to standard error unless configured otherwise,
482 // a usage message showing the default settings of all defined
483 // command-line flags.
484 // For an integer valued flag x, the default output has the form
486 // usage-message-for-x (default 7)
487 // The usage message will appear on a separate line for anything but
488 // a bool flag with a one-byte name. For bool flags, the type is
489 // omitted and if the flag name is one byte the usage message appears
490 // on the same line. The parenthetical default is omitted if the
491 // default is the zero value for the type. The listed type, here int,
492 // can be changed by placing a back-quoted name in the flag's usage
493 // string; the first such item in the message is taken to be a parameter
494 // name to show in the message and the back quotes are stripped from
495 // the message when displayed. For instance, given
496 // flag.String("I", "", "search `directory` for include files")
497 // the output will be
499 // search directory for include files.
500 func PrintDefaults() {
501 CommandLine
.PrintDefaults()
504 // defaultUsage is the default function to print a usage message.
505 func (f
*FlagSet
) defaultUsage() {
507 fmt
.Fprintf(f
.out(), "Usage:\n")
509 fmt
.Fprintf(f
.out(), "Usage of %s:\n", f
.name
)
514 // NOTE: Usage is not just defaultUsage(CommandLine)
515 // because it serves (via godoc flag Usage) as the example
516 // for how to write your own usage function.
518 // Usage prints to standard error a usage message documenting all defined command-line flags.
519 // It is called when an error occurs while parsing flags.
520 // The function is a variable that may be changed to point to a custom function.
521 // By default it prints a simple header and calls PrintDefaults; for details about the
522 // format of the output and how to control it, see the documentation for PrintDefaults.
524 fmt
.Fprintf(os
.Stderr
, "Usage of %s:\n", os
.Args
[0])
528 // NFlag returns the number of flags that have been set.
529 func (f
*FlagSet
) NFlag() int { return len(f
.actual
) }
531 // NFlag returns the number of command-line flags that have been set.
532 func NFlag() int { return len(CommandLine
.actual
) }
534 // Arg returns the i'th argument. Arg(0) is the first remaining argument
535 // after flags have been processed. Arg returns an empty string if the
536 // requested element does not exist.
537 func (f
*FlagSet
) Arg(i
int) string {
538 if i
< 0 || i
>= len(f
.args
) {
544 // Arg returns the i'th command-line argument. Arg(0) is the first remaining argument
545 // after flags have been processed. Arg returns an empty string if the
546 // requested element does not exist.
547 func Arg(i
int) string {
548 return CommandLine
.Arg(i
)
551 // NArg is the number of arguments remaining after flags have been processed.
552 func (f
*FlagSet
) NArg() int { return len(f
.args
) }
554 // NArg is the number of arguments remaining after flags have been processed.
555 func NArg() int { return len(CommandLine
.args
) }
557 // Args returns the non-flag arguments.
558 func (f
*FlagSet
) Args() []string { return f
.args
}
560 // Args returns the non-flag command-line arguments.
561 func Args() []string { return CommandLine
.args
}
563 // BoolVar defines a bool flag with specified name, default value, and usage string.
564 // The argument p points to a bool variable in which to store the value of the flag.
565 func (f
*FlagSet
) BoolVar(p
*bool, name
string, value
bool, usage
string) {
566 f
.Var(newBoolValue(value
, p
), name
, usage
)
569 // BoolVar defines a bool flag with specified name, default value, and usage string.
570 // The argument p points to a bool variable in which to store the value of the flag.
571 func BoolVar(p
*bool, name
string, value
bool, usage
string) {
572 CommandLine
.Var(newBoolValue(value
, p
), name
, usage
)
575 // Bool defines a bool flag with specified name, default value, and usage string.
576 // The return value is the address of a bool variable that stores the value of the flag.
577 func (f
*FlagSet
) Bool(name
string, value
bool, usage
string) *bool {
579 f
.BoolVar(p
, name
, value
, usage
)
583 // Bool defines a bool flag with specified name, default value, and usage string.
584 // The return value is the address of a bool variable that stores the value of the flag.
585 func Bool(name
string, value
bool, usage
string) *bool {
586 return CommandLine
.Bool(name
, value
, usage
)
589 // IntVar defines an int flag with specified name, default value, and usage string.
590 // The argument p points to an int variable in which to store the value of the flag.
591 func (f
*FlagSet
) IntVar(p
*int, name
string, value
int, usage
string) {
592 f
.Var(newIntValue(value
, p
), name
, usage
)
595 // IntVar defines an int flag with specified name, default value, and usage string.
596 // The argument p points to an int variable in which to store the value of the flag.
597 func IntVar(p
*int, name
string, value
int, usage
string) {
598 CommandLine
.Var(newIntValue(value
, p
), name
, usage
)
601 // Int defines an int flag with specified name, default value, and usage string.
602 // The return value is the address of an int variable that stores the value of the flag.
603 func (f
*FlagSet
) Int(name
string, value
int, usage
string) *int {
605 f
.IntVar(p
, name
, value
, usage
)
609 // Int defines an int flag with specified name, default value, and usage string.
610 // The return value is the address of an int variable that stores the value of the flag.
611 func Int(name
string, value
int, usage
string) *int {
612 return CommandLine
.Int(name
, value
, usage
)
615 // Int64Var defines an int64 flag with specified name, default value, and usage string.
616 // The argument p points to an int64 variable in which to store the value of the flag.
617 func (f
*FlagSet
) Int64Var(p
*int64, name
string, value
int64, usage
string) {
618 f
.Var(newInt64Value(value
, p
), name
, usage
)
621 // Int64Var defines an int64 flag with specified name, default value, and usage string.
622 // The argument p points to an int64 variable in which to store the value of the flag.
623 func Int64Var(p
*int64, name
string, value
int64, usage
string) {
624 CommandLine
.Var(newInt64Value(value
, p
), name
, usage
)
627 // Int64 defines an int64 flag with specified name, default value, and usage string.
628 // The return value is the address of an int64 variable that stores the value of the flag.
629 func (f
*FlagSet
) Int64(name
string, value
int64, usage
string) *int64 {
631 f
.Int64Var(p
, name
, value
, usage
)
635 // Int64 defines an int64 flag with specified name, default value, and usage string.
636 // The return value is the address of an int64 variable that stores the value of the flag.
637 func Int64(name
string, value
int64, usage
string) *int64 {
638 return CommandLine
.Int64(name
, value
, usage
)
641 // UintVar defines a uint flag with specified name, default value, and usage string.
642 // The argument p points to a uint variable in which to store the value of the flag.
643 func (f
*FlagSet
) UintVar(p
*uint, name
string, value
uint, usage
string) {
644 f
.Var(newUintValue(value
, p
), name
, usage
)
647 // UintVar defines a uint flag with specified name, default value, and usage string.
648 // The argument p points to a uint variable in which to store the value of the flag.
649 func UintVar(p
*uint, name
string, value
uint, usage
string) {
650 CommandLine
.Var(newUintValue(value
, p
), name
, usage
)
653 // Uint defines a uint flag with specified name, default value, and usage string.
654 // The return value is the address of a uint variable that stores the value of the flag.
655 func (f
*FlagSet
) Uint(name
string, value
uint, usage
string) *uint {
657 f
.UintVar(p
, name
, value
, usage
)
661 // Uint defines a uint flag with specified name, default value, and usage string.
662 // The return value is the address of a uint variable that stores the value of the flag.
663 func Uint(name
string, value
uint, usage
string) *uint {
664 return CommandLine
.Uint(name
, value
, usage
)
667 // Uint64Var defines a uint64 flag with specified name, default value, and usage string.
668 // The argument p points to a uint64 variable in which to store the value of the flag.
669 func (f
*FlagSet
) Uint64Var(p
*uint64, name
string, value
uint64, usage
string) {
670 f
.Var(newUint64Value(value
, p
), name
, usage
)
673 // Uint64Var defines a uint64 flag with specified name, default value, and usage string.
674 // The argument p points to a uint64 variable in which to store the value of the flag.
675 func Uint64Var(p
*uint64, name
string, value
uint64, usage
string) {
676 CommandLine
.Var(newUint64Value(value
, p
), name
, usage
)
679 // Uint64 defines a uint64 flag with specified name, default value, and usage string.
680 // The return value is the address of a uint64 variable that stores the value of the flag.
681 func (f
*FlagSet
) Uint64(name
string, value
uint64, usage
string) *uint64 {
683 f
.Uint64Var(p
, name
, value
, usage
)
687 // Uint64 defines a uint64 flag with specified name, default value, and usage string.
688 // The return value is the address of a uint64 variable that stores the value of the flag.
689 func Uint64(name
string, value
uint64, usage
string) *uint64 {
690 return CommandLine
.Uint64(name
, value
, usage
)
693 // StringVar defines a string flag with specified name, default value, and usage string.
694 // The argument p points to a string variable in which to store the value of the flag.
695 func (f
*FlagSet
) StringVar(p
*string, name
string, value
string, usage
string) {
696 f
.Var(newStringValue(value
, p
), name
, usage
)
699 // StringVar defines a string flag with specified name, default value, and usage string.
700 // The argument p points to a string variable in which to store the value of the flag.
701 func StringVar(p
*string, name
string, value
string, usage
string) {
702 CommandLine
.Var(newStringValue(value
, p
), name
, usage
)
705 // String defines a string flag with specified name, default value, and usage string.
706 // The return value is the address of a string variable that stores the value of the flag.
707 func (f
*FlagSet
) String(name
string, value
string, usage
string) *string {
709 f
.StringVar(p
, name
, value
, usage
)
713 // String defines a string flag with specified name, default value, and usage string.
714 // The return value is the address of a string variable that stores the value of the flag.
715 func String(name
string, value
string, usage
string) *string {
716 return CommandLine
.String(name
, value
, usage
)
719 // Float64Var defines a float64 flag with specified name, default value, and usage string.
720 // The argument p points to a float64 variable in which to store the value of the flag.
721 func (f
*FlagSet
) Float64Var(p
*float64, name
string, value
float64, usage
string) {
722 f
.Var(newFloat64Value(value
, p
), name
, usage
)
725 // Float64Var defines a float64 flag with specified name, default value, and usage string.
726 // The argument p points to a float64 variable in which to store the value of the flag.
727 func Float64Var(p
*float64, name
string, value
float64, usage
string) {
728 CommandLine
.Var(newFloat64Value(value
, p
), name
, usage
)
731 // Float64 defines a float64 flag with specified name, default value, and usage string.
732 // The return value is the address of a float64 variable that stores the value of the flag.
733 func (f
*FlagSet
) Float64(name
string, value
float64, usage
string) *float64 {
735 f
.Float64Var(p
, name
, value
, usage
)
739 // Float64 defines a float64 flag with specified name, default value, and usage string.
740 // The return value is the address of a float64 variable that stores the value of the flag.
741 func Float64(name
string, value
float64, usage
string) *float64 {
742 return CommandLine
.Float64(name
, value
, usage
)
745 // DurationVar defines a time.Duration flag with specified name, default value, and usage string.
746 // The argument p points to a time.Duration variable in which to store the value of the flag.
747 // The flag accepts a value acceptable to time.ParseDuration.
748 func (f
*FlagSet
) DurationVar(p
*time
.Duration
, name
string, value time
.Duration
, usage
string) {
749 f
.Var(newDurationValue(value
, p
), name
, usage
)
752 // DurationVar defines a time.Duration flag with specified name, default value, and usage string.
753 // The argument p points to a time.Duration variable in which to store the value of the flag.
754 // The flag accepts a value acceptable to time.ParseDuration.
755 func DurationVar(p
*time
.Duration
, name
string, value time
.Duration
, usage
string) {
756 CommandLine
.Var(newDurationValue(value
, p
), name
, usage
)
759 // Duration defines a time.Duration flag with specified name, default value, and usage string.
760 // The return value is the address of a time.Duration variable that stores the value of the flag.
761 // The flag accepts a value acceptable to time.ParseDuration.
762 func (f
*FlagSet
) Duration(name
string, value time
.Duration
, usage
string) *time
.Duration
{
763 p
:= new(time
.Duration
)
764 f
.DurationVar(p
, name
, value
, usage
)
768 // Duration defines a time.Duration flag with specified name, default value, and usage string.
769 // The return value is the address of a time.Duration variable that stores the value of the flag.
770 // The flag accepts a value acceptable to time.ParseDuration.
771 func Duration(name
string, value time
.Duration
, usage
string) *time
.Duration
{
772 return CommandLine
.Duration(name
, value
, usage
)
775 // Var defines a flag with the specified name and usage string. The type and
776 // value of the flag are represented by the first argument, of type Value, which
777 // typically holds a user-defined implementation of Value. For instance, the
778 // caller could create a flag that turns a comma-separated string into a slice
779 // of strings by giving the slice the methods of Value; in particular, Set would
780 // decompose the comma-separated string into the slice.
781 func (f
*FlagSet
) Var(value Value
, name
string, usage
string) {
782 // Remember the default value as a string; it won't change.
783 flag
:= &Flag
{name
, usage
, value
, value
.String()}
784 _
, alreadythere
:= f
.formal
[name
]
788 msg
= fmt
.Sprintf("flag redefined: %s", name
)
790 msg
= fmt
.Sprintf("%s flag redefined: %s", f
.name
, name
)
792 fmt
.Fprintln(f
.out(), msg
)
793 panic(msg
) // Happens only if flags are declared with identical names
796 f
.formal
= make(map[string]*Flag
)
798 f
.formal
[name
] = flag
801 // Var defines a flag with the specified name and usage string. The type and
802 // value of the flag are represented by the first argument, of type Value, which
803 // typically holds a user-defined implementation of Value. For instance, the
804 // caller could create a flag that turns a comma-separated string into a slice
805 // of strings by giving the slice the methods of Value; in particular, Set would
806 // decompose the comma-separated string into the slice.
807 func Var(value Value
, name
string, usage
string) {
808 CommandLine
.Var(value
, name
, usage
)
811 // failf prints to standard error a formatted error and usage message and
812 // returns the error.
813 func (f
*FlagSet
) failf(format
string, a
...interface{}) error
{
814 err
:= fmt
.Errorf(format
, a
...)
815 fmt
.Fprintln(f
.out(), err
)
820 // usage calls the Usage method for the flag set if one is specified,
821 // or the appropriate default usage function otherwise.
822 func (f
*FlagSet
) usage() {
830 // parseOne parses one flag. It reports whether a flag was seen.
831 func (f
*FlagSet
) parseOne() (bool, error
) {
832 if len(f
.args
) == 0 {
836 if len(s
) == 0 || s
[0] != '-' ||
len(s
) == 1 {
842 if len(s
) == 2 { // "--" terminates the flags
847 name
:= s
[numMinuses
:]
848 if len(name
) == 0 || name
[0] == '-' || name
[0] == '=' {
849 return false, f
.failf("bad flag syntax: %s", s
)
852 // it's a flag. does it have an argument?
856 for i
:= 1; i
< len(name
); i
++ { // equals cannot be first
865 flag
, alreadythere
:= m
[name
] // BUG
867 if name
== "help" || name
== "h" { // special case for nice help message.
869 return false, ErrHelp
871 return false, f
.failf("flag provided but not defined: -%s", name
)
874 if fv
, ok
:= flag
.Value
.(boolFlag
); ok
&& fv
.IsBoolFlag() { // special case: doesn't need an arg
876 if err
:= fv
.Set(value
); err
!= nil {
877 return false, f
.failf("invalid boolean value %q for -%s: %v", value
, name
, err
)
880 if err
:= fv
.Set("true"); err
!= nil {
881 return false, f
.failf("invalid boolean flag %s: %v", name
, err
)
885 // It must have a value, which might be the next argument.
886 if !hasValue
&& len(f
.args
) > 0 {
887 // value is the next arg
889 value
, f
.args
= f
.args
[0], f
.args
[1:]
892 return false, f
.failf("flag needs an argument: -%s", name
)
894 if err
:= flag
.Value
.Set(value
); err
!= nil {
895 return false, f
.failf("invalid value %q for flag -%s: %v", value
, name
, err
)
899 f
.actual
= make(map[string]*Flag
)
901 f
.actual
[name
] = flag
905 // Parse parses flag definitions from the argument list, which should not
906 // include the command name. Must be called after all flags in the FlagSet
907 // are defined and before flags are accessed by the program.
908 // The return value will be ErrHelp if -help or -h were set but not defined.
909 func (f
*FlagSet
) Parse(arguments
[]string) error
{
913 seen
, err
:= f
.parseOne()
920 switch f
.errorHandling
{
921 case ContinueOnError
:
932 // Parsed reports whether f.Parse has been called.
933 func (f
*FlagSet
) Parsed() bool {
937 // Parse parses the command-line flags from os.Args[1:]. Must be called
938 // after all flags are defined and before flags are accessed by the program.
940 // Ignore errors; CommandLine is set for ExitOnError.
941 CommandLine
.Parse(os
.Args
[1:])
944 // Parsed reports whether the command-line flags have been parsed.
946 return CommandLine
.Parsed()
949 // CommandLine is the default set of command-line flags, parsed from os.Args.
950 // The top-level functions such as BoolVar, Arg, and so on are wrappers for the
951 // methods of CommandLine.
952 var CommandLine
= NewFlagSet(os
.Args
[0], ExitOnError
)
955 // Override generic FlagSet default Usage with call to global Usage.
956 // Note: This is not CommandLine.Usage = Usage,
957 // because we want any eventual call to use any updated value of Usage,
958 // not the value it has when this line is run.
959 CommandLine
.Usage
= commandLineUsage
962 func commandLineUsage() {
966 // NewFlagSet returns a new, empty flag set with the specified name and
967 // error handling property.
968 func NewFlagSet(name
string, errorHandling ErrorHandling
) *FlagSet
{
971 errorHandling
: errorHandling
,
973 f
.Usage
= f
.defaultUsage
977 // Init sets the name and error handling property for a flag set.
978 // By default, the zero FlagSet uses an empty name and the
979 // ContinueOnError error handling policy.
980 func (f
*FlagSet
) Init(name
string, errorHandling ErrorHandling
) {
982 f
.errorHandling
= errorHandling