liyujie
2025-08-28 d9927380ed7c8366f762049be9f3fee225860833
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
// 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.
}