Source file src/flag/example_test.go
1 // Copyright 2012 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 // These examples demonstrate more intricate uses of the flag package. 6 package flag_test 7 8 import ( 9 "errors" 10 "flag" 11 "fmt" 12 "strings" 13 "time" 14 ) 15 16 // Example 1: A single string flag called "species" with default value "gopher". 17 var species = flag.String("species", "gopher", "the species we are studying") 18 19 // Example 2: Two flags sharing a variable, so we can have a shorthand. 20 // The order of initialization is undefined, so make sure both use the 21 // same default value. They must be set up with an init function. 22 var gopherType string 23 24 func init() { 25 const ( 26 defaultGopher = "pocket" 27 usage = "the variety of gopher" 28 ) 29 flag.StringVar(&gopherType, "gopher_type", defaultGopher, usage) 30 flag.StringVar(&gopherType, "g", defaultGopher, usage+" (shorthand)") 31 } 32 33 // Example 3: A user-defined flag type, a slice of durations. 34 type interval []time.Duration 35 36 // String is the method to format the flag's value, part of the flag.Value interface. 37 // The String method's output will be used in diagnostics. 38 func (i *interval) String() string { 39 return fmt.Sprint(*i) 40 } 41 42 // Set is the method to set the flag value, part of the flag.Value interface. 43 // Set's argument is a string to be parsed to set the flag. 44 // It's a comma-separated list, so we split it. 45 func (i *interval) Set(value string) error { 46 // If we wanted to allow the flag to be set multiple times, 47 // accumulating values, we would delete this if statement. 48 // That would permit usages such as 49 // -deltaT 10s -deltaT 15s 50 // and other combinations. 51 if len(*i) > 0 { 52 return errors.New("interval flag already set") 53 } 54 for _, dt := range strings.Split(value, ",") { 55 duration, err := time.ParseDuration(dt) 56 if err != nil { 57 return err 58 } 59 *i = append(*i, duration) 60 } 61 return nil 62 } 63 64 // Define a flag to accumulate durations. Because it has a special type, 65 // we need to use the Var function and therefore create the flag during 66 // init. 67 68 var intervalFlag interval 69 70 func init() { 71 // Tie the command-line flag to the intervalFlag variable and 72 // set a usage message. 73 flag.Var(&intervalFlag, "deltaT", "comma-separated list of intervals to use between events") 74 } 75 76 func Example() { 77 // All the interesting pieces are with the variables declared above, but 78 // to enable the flag package to see the flags defined there, one must 79 // execute, typically at the start of main (not init!): 80 // flag.Parse() 81 // We don't call it here because this code is a function called "Example" 82 // that is part of the testing suite for the package, which has already 83 // parsed the flags. When viewed at pkg.go.dev, however, the function is 84 // renamed to "main" and it could be run as a standalone example. 85 } 86