84 lines
2.6 KiB
Go
84 lines
2.6 KiB
Go
|
// 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.
|
||
|
}
|