mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			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.
 | 
						|
}
 |