©
本文档使用
php.cn手册 发布
import "flag"
概述
索引
例子
Flag 包实现了命令行标志解析。
用法:
使用 flag.String(),Bool(),Int() 等定义标志。
这声明了一个整型 flag,-flagname,都存储在指针 ip 中,类型为 *int 。
import "flag"var ip = flag.Int("flagname", 1234, "help message for flagname")
如果你喜欢,你可以使用 Var() 函数将标志绑定到一个变量。
var flagvar int func init() { flag.IntVar(&flagvar, "flagname", 1234, "help message for flagname")}
或者,您可以创建满足 Value 接口(使用指针接收器)的自定义标志,并将它们耦合以标记解析
flag.Var(&flagVal, "name", "help message for flagname")
对于这样的标志,默认值只是变量的初始值。
所有标志定义后,调用
flag.Parse()
来将命令行解析为定义的标志。
标志可以直接使用。如果你自己使用标志,它们都是指针; 如果你绑定到变量,它们就是值。
fmt.Println("ip has value ", *ip)fmt.Println("flagvar has value ", flagvar)
解析后,标志后面的参数可用作切片 flag.Args() 或单独作为 flag.Arg(i)。参数从 0 到 flag.NArg()- 1 索引。
命令行标志语法:
-flag-flag=x-flag x // 仅限非布尔标志
可以使用一个或两个减号;它们是等价的。由于命令的含义,最后一种形式不允许用于布尔标志
cmd -x *
如果有一个名为 0,false 等的文件,它将会改变。你必须使用 -flag = false 来关闭布尔标志。
标志解析在第一个非标志参数(“ - ”是非标志参数)之前停止,或者在终止符“ - ”之后停止。
整数标志接受 1234,0664,0x1234 并且可能是负数。布尔标志可能是:
1, 0, t, f, T, F, true, false, TRUE, FALSE, True, False
持续时间标志接受对 time.ParseDuration 有效的任何输入。
默认的一组命令行标志由顶层函数控制。FlagSet 类型允许您定义独立的标志集,例如在命令行界面中实现子命令。FlagSet 的方法类似于命令行标志集的顶层函数。
// 这些示例演示了对标志包的更复杂的使用。package mainimport ("errors""flag""fmt""strings""time")// 示例1:名为“species”的单个字符串标志,默认值为“gopher”。var species = flag.String("species", "gopher", "the species we are studying")// 示例2:共享变量的两个标志,因此我们可以使用速记。// 初始化的顺序是未定义的,因此请确保两者都使用// 相同的默认值。 必须使用init函数设置它们。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)")}// 示例3:用户定义的标志类型,持续时间片。type interval []time.Duration// String是格式化标志值的方法,是flag.Value接口的一部分。// String方法的输出将用于诊断。func (i *interval) String() string {return fmt.Sprint(*i)}// Set是设置标志值的方法,flag.Value接口的一部分。// Set的参数是要解析以设置标志的字符串。// 这是一个以逗号分隔的列表,因此我们将其拆分。func (i *interval) Set(value string) error {// 如果我们想允许多次设置标志,// 累积值,我们将删除此if语句。// 这将允许诸如此类的用法// -deltaT 10s -deltaT 15s// 和其他组合。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}// 定义一个标志来累积持续时间。 因为它有特殊的类型,// 我们需要使用Var函数,因此在期间创建标志// init。var intervalFlag interval func init() {// 将命令行标志绑定到intervalFlag变量和// 设置用法消息。 flag.Var(&intervalFlag, "deltaT", "comma-separated list of intervals to use between events")}func main() {// 所有有趣的部分都是上面声明的变量,但是// 要使标志包能够看到那里定义的标志,就必须这样做// 执行,通常在main(不是init!)的开头执行:// flag.Parse()// 我们不在这里运行它,因为这不是主要功能//测试套件已经解析了标志。}
Variables
func Arg(i int) string
func Args() []string
func Bool(name string, value bool, usage string) *bool
func BoolVar(p *bool, name string, value bool, usage string)
func Duration(name string, value time.Duration, usage string) *time.Duration
func DurationVar(p *time.Duration, name string, value time.Duration, usage string)
func Float64(name string, value float64, usage string) *float64
func Float64Var(p *float64, name string, value float64, usage string)
func Int(name string, value int, usage string) *int
func Int64(name string, value int64, usage string) *int64
func Int64Var(p *int64, name string, value int64, usage string)
func IntVar(p *int, name string, value int, usage string)
func NArg() int
func NFlag() int
func Parse()
func Parsed() bool
func PrintDefaults()
func Set(name, value string) error
func String(name string, value string, usage string) *string
func StringVar(p *string, name string, value string, usage string)
func Uint(name string, value uint, usage string) *uint
func Uint64(name string, value uint64, usage string) *uint64
func Uint64Var(p *uint64, name string, value uint64, usage string)
func UintVar(p *uint, name string, value uint, usage string)
func UnquoteUsage(flag *Flag) (name string, usage string)
func Var(value Value, name string, usage string)
func Visit(fn func(*Flag))
func VisitAll(fn func(*Flag))
type ErrorHandling
类型标志
func Lookup(name string) *Flag
type FlagSet
func NewFlagSet(name string, errorHandling ErrorHandling) *FlagSet
func (f *FlagSet) Arg(i int) string
func (f *FlagSet) Args() []string
func (f *FlagSet) Bool(name string, value bool, usage string) *bool
func (f *FlagSet) BoolVar(p *bool, name string, value bool, usage string)
func (f *FlagSet) Duration(name string, value time.Duration, usage string) *time.Duration
func (f *FlagSet) DurationVar(p *time.Duration, name string, value time.Duration, usage string)
func (f *FlagSet) Float64(name string, value float64, usage string) *float64
func (f *FlagSet) Float64Var(p *float64, name string, value float64, usage string)
func (f *FlagSet) Init(name string, errorHandling ErrorHandling)
func (f *FlagSet) Int(name string, value int, usage string) *int
func (f *FlagSet) Int64(name string, value int64, usage string) *int64
func (f *FlagSet) Int64Var(p *int64, name string, value int64, usage string)
func (f *FlagSet) IntVar(p *int, name string, value int, usage string)
func (f *FlagSet) Lookup(name string) *Flag
func (f *FlagSet) NArg() int
func (f *FlagSet) NFlag() int
func (f *FlagSet) Parse(arguments []string) error
func (f *FlagSet) Parsed() bool
func (f *FlagSet) PrintDefaults()
func (f *FlagSet) Set(name, value string) error
func (f *FlagSet) SetOutput(output io.Writer)
func (f *FlagSet) String(name string, value string, usage string) *string
func (f *FlagSet) StringVar(p *string, name string, value string, usage string)
func (f *FlagSet) Uint(name string, value uint, usage string) *uint
func (f *FlagSet) Uint64(name string, value uint64, usage string) *uint64
func (f *FlagSet) Uint64Var(p *uint64, name string, value uint64, usage string)
func (f *FlagSet) UintVar(p *uint, name string, value uint, usage string)
func (f *FlagSet) Var(value Value, name string, usage string)
func (f *FlagSet) Visit(fn func(*Flag))
func (f *FlagSet) VisitAll(fn func(*Flag))
type Getter
type Value
包
flag.go
CommandLine 是从 os.Args 解析的默认命令行标志集。顶级函数(如 BoolVar,Arg 等)是 CommandLine方法的包装器。
var CommandLine = NewFlagSet(os.Args[0], ExitOnError)
如果调用了 -help 或 -h 标志但没有定义这样的标志,ErrHelp 是返回的错误。
var ErrHelp = errors.New("flag: help requested")
用法向标准错误输出记录所有定义的命令行标志的用法消息。它在解析标志时发生错误时被调用。该函数是一个可以更改为指向自定义函数的变量。默认情况下,它打印一个简单的标题并调用 PrintDefaults ; 有关输出格式以及如何控制它的详细信息,请参阅 PrintDefaults 的文档。
var Usage = func() { fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0]) PrintDefaults()}
func Arg(i int) string
Arg 返回第 i 个命令行参数。Arg(0)是标志处理后的第一个剩余参数。如果请求的元素不存在,则 Arg 返回一个空字符串。
func Args() []string
Args 返回非标志命令行参数。
func Bool(name string, value bool, usage string) *bool
Bool 定义了一个具有指定名称,默认值和用法字符串的布尔标志。返回值是存储标志值的 bool 变量的地址。
func BoolVar(p *bool, name string, value bool, usage string)
BoolVar 定义了一个具有指定名称,默认值和用法字符串的布尔标志。参数 p 指向一个存储标志值的 bool 变量。
func Duration(name string, value time.Duration, usage string) *time.Duration
持续时间定义了一个带指定名称,缺省值和用法字符串的 time.Duration 标志。返回值是存储标志值的 time.Duration 变量的地址。该标志接受 time.ParseDuration 可接受的值。
func DurationVar(p *time.Duration, name string, value time.Duration, usage string)
DurationVar 定义了一个具有指定名称,缺省值和用法字符串的 time.Duration 标志。参数 p 指向一个用于存储标志值的 time.Duration 变量。该标志接受 time.ParseDuration 可接受的值。
func Float64(name string, value float64, usage string) *float64
Float64 定义了一个带有指定名称,缺省值和用法字符串的 float64 标志。返回值是存储标志值的 float64 变量的地址。
func Float64Var(p *float64, name string, value float64, usage string)
Float64Var 定义了一个带有指定名称,缺省值和用法字符串的 float64 标志。参数 p 指向一个 float64 变量,用于存储标志的值。
func Int(name string, value int, usage string) *int
Int 定义了一个具有指定名称,默认值和用法字符串的 int 标志。返回值是存储标志值的 int 变量的地址。
func Int64(name string, value int64, usage string) *int64
Int64 定义了一个具有指定名称,缺省值和用法字符串的 int64 标志。返回值是存储标志值的 int64 变量的地址。
func Int64Var(p *int64, name string, value int64, usage string)
Int64Var 定义了一个带有指定名称,默认值和用法字符串的 int64 标志。参数 p 指向一个 int64 变量,用于存储标志的值。
func IntVar(p *int, name string, value int, usage string)
IntVar 定义了一个具有指定名称,默认值和用法字符串的 int 标志。参数 p 指向一个 int 变量,用于存储标志的值。
func NArg() int
NArg 是标志处理后剩余的参数数量。
func NFlag() int
NFlag 返回已设置的命令行标志的数量。
func Parse()
解析解析 os.Args1:中的命令行标志。必须在定义了所有标志之后并且在程序访问标志之前调用。
func Parsed() bool
Parsed 报告命令行标志是否已被解析。
func PrintDefaults()
除非另行配置,否则 PrintDefaults 会打印标准错误,显示所有已定义的命令行标志的默认设置。对于整数值标志 x,默认输出具有该形式
-x int usage-message-for-x (default 7)
除了带有单字节名称的布尔标志之外,用法消息将显示在单独的行上。对于 bool 标志,类型被省略,并且如果标志名称是一个字节,则使用消息出现在同一行上。如果默认值是类型的零值,则省略括号默认值。列出的类型(这里是 int)可以通过在标志的使用字符串中放置一个反引号的名称来更改; 消息中的第一个这样的项目被视为在消息中显示的参数名称,并且在显示时从消息中除去后面的引号。例如,给出
flag.String("I", "", "search `directory` for include files")
输出将是
-I directory search directory for include files.
func Set(name, value string) error
Set 设置命名的命令行标志的值。
func String(name string, value string, usage string) *string
字符串定义了一个具有指定名称,缺省值和用法字符串的字符串标志。返回值是存储标志值的字符串变量的地址。
func StringVar(p *string, name string, value string, usage string)
StringVar 定义了一个具有指定名称,默认值和用法字符串的字符串标志。参数 p 指向一个字符串变量,用于存储标志的值。
func Uint(name string, value uint, usage string) *uint
Uint 定义一个具有指定名称,默认值和用法字符串的 uint 标志。返回值是存储标志值的 uint 变量的地址。
func Uint64(name string, value uint64, usage string) *uint64
Uint64 定义了一个具有指定名称,默认值和用法字符串的 uint64 标志。返回值是存储标志值的 uint64 变量的地址。
func Uint64Var(p *uint64, name string, value uint64, usage string)
Uint64Var 定义了一个具有指定名称,默认值和用法字符串的 uint64 标志。参数 p 指向一个 uint64 变量,用于存储标志的值。
func UintVar(p *uint, name string, value uint, usage string)
UintVar 定义了一个具有指定名称,默认值和用法字符串的 uint 标志。参数 p 指向一个存储标志值的 uint 变量。
func UnquoteUsage(flag *Flag) (name string, usage string)
UnquoteUsage 从标志的用法字符串中提取一个反引号的名称,并返回它和未加引号的用法。给定“ name
显示”它返回(“名称”,“显示的名称”)。如果没有后引号,则该名称是对标志值类型的合理猜测,如果标志为布尔值,则为空字符串。
func Var(value Value, name string, usage string)
Var 定义了一个具有指定名称和用法字符串的标志。标志的类型和值由 Value 类型的第一个参数表示,它通常包含 Value 的用户定义实现。例如,调用者可以创建一个标志,通过为切片提供 Value 的方法来将逗号分隔的字符串转换为一段字符串; 特别是 Set 会将逗号分隔的字符串分解成片。
func Visit(fn func(*Flag))
Visit 按照字典顺序访问命令行标志,为每个标志调用 fn 。它只访问已设置的标志。
func VisitAll(fn func(*Flag))
VisitAll 按照字典顺序访问命令行标志,为每个命令调用 fn 。它访问所有的标志,甚至没有设置。
ErrorHandling 定义了解析失败时 FlagSet.Parse 的行为。
type ErrorHandling int
如果解析失败,这些常量会导致 FlagSet.Parse 的行为与所述相同。
const ( ContinueOnError ErrorHandling = iota // Return a descriptive error. ExitOnError // Call os.Exit(2). PanicOnError // Call panic with a descriptive error.)
一个标志表示一个标志的状态。
type Flag struct { Name string // name as it appears on command line Usage string // help message Value Value // value as set DefValue string // default value (as text); for usage message}
func Lookup(name string) *Flag
Lookup 返回指定命令行标志的标志结构,如果不存在则返回 nil 。
FlagSet 表示一组定义的标志。FlagSet 的零值没有名称,并且具有 ContinueOnError 错误处理。
type FlagSet struct { // Usage is the function called when an error occurs while parsing flags. // The field is a function (not a method) that may be changed to point to // a custom error handler. Usage func() // contains filtered or unexported fields}
func NewFlagSet(name string, errorHandling ErrorHandling) *FlagSet
NewFlagSet 使用指定的名称和错误处理属性返回一个新的空标志集。
func (f *FlagSet) Arg(i int) string
Arg 返回第 i 个参数。Arg(0)是标志处理后的第一个剩余参数。如果请求的元素不存在,则 Arg 返回一个空字符串。
func (f *FlagSet) Args() []string
Args 返回非标志参数。
func (f *FlagSet) Bool(name string, value bool, usage string) *bool
Bool 定义了一个具有指定名称,默认值和用法字符串的布尔标志。返回值是存储标志值的 bool 变量的地址。
func (f *FlagSet) BoolVar(p *bool, name string, value bool, usage string)
BoolVar 定义了一个具有指定名称,默认值和用法字符串的布尔标志。参数 p 指向一个存储标志值的 bool 变量。
func (f *FlagSet) Duration(name string, value time.Duration, usage string) *time.Duration
持续时间定义了一个带指定名称,缺省值和用法字符串的 time.Duration 标志。返回值是存储标志值的 time.Duration 变量的地址。该标志接受 time.ParseDuration 可接受的值。
func (f *FlagSet) DurationVar(p *time.Duration, name string, value time.Duration, usage string)
DurationVar 定义了一个具有指定名称,缺省值和用法字符串的 time.Duration 标志。参数 p 指向一个用于存储标志值的 time.Duration 变量。该标志接受 time.ParseDuration 可接受的值。
func (f *FlagSet) Float64(name string, value float64, usage string) *float64
Float64 定义了一个带有指定名称,缺省值和用法字符串的 float64 标志。返回值是存储标志值的 float64 变量的地址。
func (f *FlagSet) Float64Var(p *float64, name string, value float64, usage string)
Float64Var 定义了一个带有指定名称,缺省值和用法字符串的 float64 标志。参数 p 指向一个 float64 变量,用于存储标志的值。
func (f *FlagSet) Init(name string, errorHandling ErrorHandling)
Init 为标志集设置名称和错误处理属性。默认情况下,zero FlagSet 使用空名称和 ContinueOnError 错误处理策略。
func (f *FlagSet) Int(name string, value int, usage string) *int
Int 定义了一个具有指定名称,默认值和用法字符串的 int 标志。返回值是存储标志值的 int 变量的地址。
func (f *FlagSet) Int64(name string, value int64, usage string) *int64
Int64 定义了一个具有指定名称,缺省值和用法字符串的 int64 标志。返回值是存储标志值的 int64 变量的地址。
func (f *FlagSet) Int64Var(p *int64, name string, value int64, usage string)
Int64Var 定义了一个带有指定名称,默认值和用法字符串的 int64 标志。参数 p 指向一个 int64 变量,用于存储标志的值。
func (f *FlagSet) IntVar(p *int, name string, value int, usage string)
IntVar 定义了一个具有指定名称,默认值和用法字符串的 int 标志。参数 p 指向一个 int 变量,用于存储标志的值。
func (f *FlagSet) Lookup(name string) *Flag
Lookup 返回指定标志的标志结构,如果不存在则返回 nil 。
func (f *FlagSet) NArg() int
NArg 是标志处理后剩余的参数数量。
func (f *FlagSet) NFlag() int
NFlag 返回已设置的标志数量。
func (f *FlagSet) Parse(arguments []string) error
解析解析参数列表中的标志定义,该列表不应包含命令名称。必须在 FlagSet 中的所有标志被定义之后且在程序访问标志之前调用。如果设置了 -help 或 -h 但未定义,则返回值为 ErrHelp 。
func (f *FlagSet) Parsed() bool
Parsed 报告是否调用了f.Parse。
func (f *FlagSet) PrintDefaults()
PrintDefaults 将标准错误打印到集合中所有已定义的命令行标志的默认值。有关更多信息,请参阅全局函数 PrintDefaults 的文档。
func (f *FlagSet) Set(name, value string) error
Set 设置指定标志的值。
func (f *FlagSet) SetOutput(output io.Writer)
SetOutput 设置使用和错误消息的目的地。如果输出为零,则使用 os.Stderr 。
func (f *FlagSet) String(name string, value string, usage string) *string
字符串定义了一个具有指定名称,缺省值和用法字符串的字符串标志。返回值是存储标志值的字符串变量的地址。
func (f *FlagSet) StringVar(p *string, name string, value string, usage string)
StringVar 定义了一个具有指定名称,默认值和用法字符串的字符串标志。参数 p 指向一个字符串变量,用于存储标志的值。
func (f *FlagSet) Uint(name string, value uint, usage string) *uint
Uint 定义一个具有指定名称,默认值和用法字符串的 uint 标志。返回值是存储标志值的 uint 变量的地址。
func (f *FlagSet) Uint64(name string, value uint64, usage string) *uint64
Uint64 定义了一个具有指定名称,默认值和用法字符串的 uint64 标志。返回值是存储标志值的 uint64 变量的地址。
func (f *FlagSet) Uint64Var(p *uint64, name string, value uint64, usage string)
Uint64Var 定义了一个具有指定名称,默认值和用法字符串的 uint64 标志。参数 p 指向一个 uint64 变量,用于存储标志的值。
func (f *FlagSet) UintVar(p *uint, name string, value uint, usage string)
UintVar 定义了一个具有指定名称,默认值和用法字符串的 uint 标志。参数 p 指向一个存储标志值的 uint 变量。
func (f *FlagSet) Var(value Value, name string, usage string)
Var 定义了一个具有指定名称和用法字符串的标志。标志的类型和值由 Value 类型的第一个参数表示,它通常包含 Value 的用户定义实现。例如,调用者可以创建一个标志,通过为切片提供 Value 的方法来将逗号分隔的字符串转换为一段字符串;特别是 Set 会将逗号分隔的字符串分解成片。
func (f *FlagSet) Visit(fn func(*Flag))
Visit 按照字典顺序访问标志,为每个标志调用 fn 。它只访问已设置的标志。
func (f *FlagSet) VisitAll(fn func(*Flag))
VisitAll 按字典顺序访问标志,为每个标志调用 fn 。它访问所有的标志,甚至没有设置。
Getter 是一个接口,允许检索值的内容。它包装了 Value 接口,而不是其中的一部分,因为它出现在 Go 1 及其兼容性规则之后。此包提供的所有值类型均满足 Getter 接口。
type Getter interface { Value Get() interface{}}
值是存储在标志中的动态值的接口。(默认值表示为一个字符串。)
如果值的 IsBoolFlag() bool 方法返回 true,则命令行解析器将使 -name 等同于 -name = true,而不是使用下一个命令行参数。
对于每个存在的标志,集合都以命令行顺序调用一次。标志包可以用一个零值接收者(例如零指针)调用 String 方法。
type Value interface { String() string Set(string) error}