| // Copyright 2012 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // These examples demonstrate more intricate uses of the flag package. |
| package flag_test |
| |
| import ( |
| "errors" |
| "flag" |
| "fmt" |
| "strings" |
| "time" |
| ) |
| |
| // Example 1: A single string flag called "species" with default value "gopher". |
| var species = flag.String("species", "gopher", "the species we are studying") |
| |
| // Example 2: Two flags sharing a variable, so we can have a shorthand. |
| // The order of initialization is undefined, so make sure both use the |
| // same default value. They must be set up with an init function. |
| var gopherType string |
| |
| func init() { |
| const ( |
| defaultGopher = "pocket" |
| usage = "the variety of gopher" |
| ) |
| flag.StringVar(&gopherType, "gopher_type", defaultGopher, usage) |
| flag.StringVar(&gopherType, "g", defaultGopher, usage+" (shorthand)") |
| } |
| |
| // Example 3: A user-defined flag type, a slice of durations. |
| type interval []time.Duration |
| |
| // String is the method to format the flag's value, part of the flag.Value interface. |
| // The String method's output will be used in diagnostics. |
| func (i *interval) String() string { |
| return fmt.Sprint(*i) |
| } |
| |
| // Set is the method to set the flag value, part of the flag.Value interface. |
| // Set's argument is a string to be parsed to set the flag. |
| // It's a comma-separated list, so we split it. |
| func (i *interval) Set(value string) error { |
| // If we wanted to allow the flag to be set multiple times, |
| // accumulating values, we would delete this if statement. |
| // That would permit usages such as |
| // -deltaT 10s -deltaT 15s |
| // and other combinations. |
| if len(*i) > 0 { |
| return errors.New("interval flag already set") |
| } |
| for _, dt := range strings.Split(value, ",") { |
| duration, err := time.ParseDuration(dt) |
| if err != nil { |
| return err |
| } |
| *i = append(*i, duration) |
| } |
| return nil |
| } |
| |
| // Define a flag to accumulate durations. Because it has a special type, |
| // we need to use the Var function and therefore create the flag during |
| // init. |
| |
| var intervalFlag interval |
| |
| func init() { |
| // Tie the command-line flag to the intervalFlag variable and |
| // set a usage message. |
| flag.Var(&intervalFlag, "deltaT", "comma-separated list of intervals to use between events") |
| } |
| |
| func Example() { |
| // All the interesting pieces are with the variables declared above, but |
| // to enable the flag package to see the flags defined there, one must |
| // execute, typically at the start of main (not init!): |
| // flag.Parse() |
| // We don't run it here because this is not a main function and |
| // the testing suite has already parsed the flags. |
| } |