flag(命令行参数解析flag包)
Package flag
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 main
import (
"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
示例
包
包文件
变量
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(显示源代码)
func Arg(i int) string
Arg 返回第 i 个命令行参数。Arg(0) 是标志处理后的第一个剩余参数。如果请求的元素不存在,则 Arg 返回一个空字符串。
func Args(显示源代码)
func Args() []string
Args 返回非标志命令行参数。
func Bool(显示源代码)
func Bool(name string, value bool, usage string) *bool
Bool 定义了一个具有指定名称,默认值和用法字符串的布尔标志。返回值是存储标志值的 bool 变量的地址。
func BoolVar(显示源代码)
func BoolVar(p *bool, name string, value bool, usage string)
BoolVar 定义了一个具有指定名称,默认值和用法字符串的布尔标志。参数 p 指向一个存储标志值的 bool 变量。
func Duration(显示源代码)
func Duration(name string, value time.Duration, usage string) *time.Duration
持续时间定义了一个带指定名称,缺省值和用法字符串的 time.Duration 标志。返回值是存储标志值的 time.Duration 变量的地址。该标志接受 time.ParseDuration 可接受的值。
func DurationVar(显示源代码)
func DurationVar(p *time.Duration, name string, value time.Duration, usage string)
DurationVar 定义了一个具有指定名称,缺省值和用法字符串的 time.Duration 标志。参数 p 指向一个用于存储标志值的 time.Duration 变量。该标志接受 time.ParseDuration 可接受的值。
func Float64(显示源代码)
func Float64(name string, value float64, usage string) *float64
Float64 定义了一个带有指定名称,缺省值和用法字符串的 float64 标志。返回值是存储标志值的 float64 变量的地址。
func Float64Var(显示源代码)
func Float64Var(p *float64, name string, value float64, usage string)
Float64Var 定义了一个带有指定名称,缺省值和用法字符串的 float64 标志。参数 p 指向一个 float64 变量,用于存储标志的值。
func Int(显示源代码)
func Int(name string, value int, usage string) *int
Int 定义了一个具有指定名称,默认值和用法字符串的 int 标志。返回值是存储标志值的 int 变量的地址。
func Int64(显示源代码)
func Int64(name string, value int64, usage string) *int64
Int64 定义了一个具有指定名称,缺省值和用法字符串的 int64 标志。返回值是存储标志值的 int64 变量的地址。
func Int64Var(显示源代码)
func Int64Var(p *int64, name string, value int64, usage string)
Int64Var 定义了一个带有指定名称,默认值和用法字符串的 int64 标志。参数 p 指向一个 int64 变量,用于存储标志的值。
func IntVar(显示源代码)
func IntVar(p *int, name string, value int, usage string)
IntVar 定义了一个具有指定名称,默认值和用法字符串的 int 标志。参数 p 指向一个 int 变量,用于存储标志的值。
func NArg(显示源代码)
func NArg() int
NArg 是标志处理后剩余的参数数量。
func NFlag(显示源代码)
func NFlag() int
NFlag 返回已设置的命令行标志的数量。
func Parse(显示源代码)
func Parse()
解析解析 os.Args1: 中的命令行标志。必须在定义了所有标志之后并且在程序访问标志之前调用。
func Parsed(显示源代码)
func Parsed() bool
Parsed 报告命令行标志是否已被解析。
func PrintDefaults(显示源代码)
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(显示源代码)
func Set(name, value string) error
Set 设置命名的命令行标志的值。
func String(显示源代码)
func String(name string, value string, usage string) *string
字符串定义了一个具有指定名称,缺省值和用法字符串的字符串标志。返回值是存储标志值的字符串变量的地址。
func StringVar(显示源代码)
func StringVar(p *string, name string, value string, usage string)
StringVar 定义了一个具有指定名称,默认值和用法字符串的字符串标志。参数 p 指向一个字符串变量,用于存储标志的值。
func Uint(显示源代码)
func Uint(name string, value uint, usage string) *uint
Uint 定义一个具有指定名称,默认值和用法字符串的 uint 标志。返回值是存储标志值的 uint 变量的地址。
func Uint64(显示源代码)
func Uint64(name string, value uint64, usage string) *uint64
Uint64 定义了一个具有指定名称,默认值和用法字符串的 uint64 标志。返回值是存储标志值的 uint64 变量的地址。
func Uint64Var(显示源代码)
func Uint64Var(p *uint64, name string, value uint64, usage string)
Uint64Var 定义了一个具有指定名称,默认值和用法字符串的 uint64 标志。参数 p 指向一个 uint64 变量,用于存储标志的值。
func UintVar(显示源代码)
func UintVar(p *uint, name string, value uint, usage string)
UintVar 定义了一个具有指定名称,默认值和用法字符串的 uint 标志。参数 p 指向一个存储标志值的 uint 变量。
func UnquoteUsage(显示源代码)
func UnquoteUsage(flag *Flag) (name string, usage string)
UnquoteUsage 从标志的用法字符串中提取一个反引号的名称,并返回它和未加引号的用法。给定“ name
显示”它返回(“name
”,“a name
to show”)。如果没有后引号,则该名称是对标志值类型的合理猜测,如果标志为布尔值,则为空字符串。
func Var(显示源代码)
func Var(value Value, name string, usage string)
Var 定义了一个具有指定名称和用法字符串的标志。标志的类型和值由 Value 类型的第一个参数表示,它通常包含 Value 的用户定义实现。例如,调用者可以创建一个标志,通过为切片提供 Value 的方法来将逗号分隔的字符串转换为一段字符串; 特别是 Set 会将逗号分隔的字符串分解成片。
func Visit(显示源代码)
func Visit(fn func(*Flag))
Visit 按照字典顺序访问命令行标志,为每个标志调用 fn 。它只访问已设置的标志。
func VisitAll(显示源代码)
func VisitAll(fn func(*Flag))
VisitAll 按照字典顺序访问命令行标志,为每个命令调用 fn 。它访问所有的标志,甚至没有设置。
type ErrorHandling(显示源代码)
ErrorHandling 定义了解析失败时 FlagSet.Parse 的行为。
type ErrorHandling int
如果解析失败,这些常量会导致 FlagSet.Parse 的行为与所述相同。
const (
ContinueOnError ErrorHandling = iota // 返回描述性错误。
ExitOnError // 调用 os.Exit(2)。
PanicOnError // 用描述性错误调用panic。
)
type Flag(显示源代码)
一个标志(Flag)表示一个标志的状态。
type Flag struct {
Name string // 命令行上显示的名称
Usage string // 帮助信息
Value Value // 设定值
DefValue string // 默认值(作为文本); 用法信息
func Lookup(显示源代码)
func Lookup(name string) *Flag
Lookup 返回指定命令行标志的标志结构,如果不存在则返回 nil 。
type FlagSet(显示源代码)
FlagSet 表示一组定义的标志。FlagSet 的零值没有名称,并且具有 ContinueOnError 错误处理。
type FlagSet struct {
// 用法是解析标志时发生错误时调用的函数。
// 该字段是可以更改为指向的函数(不是方法)
// 自定义错误处理程序。
Usage func()
// 包含已过滤或未导出的字段
}
func NewFlagSet(显示源代码)
func NewFlagSet(name string, errorHandling ErrorHandling) *FlagSet
NewFlagSet 使用指定的名称和错误处理属性返回一个新的空标志集。
func (*FlagSet) Arg(显示源代码)
func (f *FlagSet) Arg(i int) string
Arg 返回第 i 个参数。Arg(0) 是标志处理后的第一个剩余参数。如果请求的元素不存在,则 Arg 返回一个空字符串。
func (*FlagSet) Args(显示源代码)
func (f *FlagSet) Args() []string
Args 返回非标志参数。
func (*FlagSet) Bool(显示源代码)
func (f *FlagSet) Bool(name string, value bool, usage string) *bool
Bool 定义了一个具有指定名称,默认值和用法字符串的布尔标志。返回值是存储标志值的 bool 变量的地址。
func (*FlagSet) BoolVar(显示源代码)
func (f *FlagSet) BoolVar(p *bool, name string, value bool, usage string)
BoolVar 定义了一个具有指定名称,默认值和用法字符串的布尔标志。参数 p 指向一个存储标志值的 bool 变量。
func (*FlagSet) Duration(显示源代码)
func (f *FlagSet) Duration(name string, value time.Duration, usage string) *time.Duration
持续时间定义了一个带指定名称,缺省值和用法字符串的 time.Duration 标志。返回值是存储标志值的 time.Duration 变量的地址。该标志接受 time.ParseDuration 可接受的值。
func (*FlagSet) DurationVar(显示源代码)
func (f *FlagSet) DurationVar(p *time.Duration, name string, value time.Duration, usage string)
DurationVar 定义了一个具有指定名称,缺省值和用法字符串的 time.Duration 标志。参数 p 指向一个用于存储标志值的 time.Duration 变量。该标志接受 time.ParseDuration 可接受的值。
func (*FlagSet) Float64(显示源代码)
func (f *FlagSet) Float64(name string, value float64, usage string) *float64
Float64 定义了一个带有指定名称,缺省值和用法字符串的 float64 标志。返回值是存储标志值的 float64 变量的地址。
func (*FlagSet) Float64Var(显示源代码)
func (f *FlagSet) Float64Var(p *float64, name string, value float64, usage string)
Float64Var 定义了一个带有指定名称,缺省值和用法字符串的 float64 标志。参数 p 指向一个 float64 变量,用于存储标志的值。
func (*FlagSet) Init(显示源代码)
func (f *FlagSet) Init(name string, errorHandling ErrorHandling)
Init 为标志集设置名称和错误处理属性。默认情况下,zero FlagSet 使用空名称和 ContinueOnError 错误处理策略。
func (*FlagSet) Int(显示源代码)
func (f *FlagSet) Int(name string, value int, usage string) *int
Int 定义了一个具有指定名称,默认值和用法字符串的 int 标志。返回值是存储标志值的 int 变量的地址。
func (*FlagSet) Int64(显示源代码)
func (f *FlagSet) Int64(name string, value int64, usage string) *int64
Int64 定义了一个具有指定名称,缺省值和用法字符串的 int64 标志。返回值是存储标志值的 int64 变量的地址。
func (*FlagSet) Int64Var(显示源代码)
func (f *FlagSet) Int64Var(p *int64, name string, value int64, usage string)
Int64Var 定义了一个带有指定名称,默认值和用法字符串的 int64 标志。参数 p 指向一个 int64 变量,用于存储标志的值。
func (*FlagSet) IntVar(显示源代码)
func (f *FlagSet) IntVar(p *int, name string, value int, usage string)
IntVar 定义了一个具有指定名称,默认值和用法字符串的 int 标志。参数 p 指向一个 int 变量,用于存储标志的值。
func (*FlagSet) Lookup(显示源代码)
func (f *FlagSet) Lookup(name string) *Flag
Lookup 返回指定标志的标志结构,如果不存在则返回 nil 。
func (*FlagSet) NArg(显示源代码)
func (f *FlagSet) NArg() int
NArg 是标志处理后剩余的参数数量。
func (*FlagSet) NFlag(显示源代码)
func (f *FlagSet) NFlag() int
NFlag 返回已设置的标志数量。
func (*FlagSet) Parse(显示源代码)
func (f *FlagSet) Parse(arguments []string) error
解析解析参数列表中的标志定义,该列表不应包含命令名称。必须在 FlagSet 中的所有标志被定义之后且在程序访问标志之前调用。如果设置了 -help 或 -h 但未定义,则返回值为 ErrHelp 。
func (*FlagSet) Parsed(显示源代码)
func (f *FlagSet) Parsed() bool
Parsed 报告是否调用了 f.Parse。
func (*FlagSet) PrintDefaults(显示源代码)
func (f *FlagSet) PrintDefaults()
PrintDefaults 将标准错误打印到集合中所有已定义的命令行标志的默认值。有关更多信息,请参阅全局函数 PrintDefaults 的文档。
func (*FlagSet) Set(显示源代码)
func (f *FlagSet) Set(name, value string) error
Set 设置指定标志的值。
func (*FlagSet) SetOutput(显示源代码)
func (f *FlagSet) SetOutput(output io.Writer)
SetOutput 设置使用和错误消息的目的地。如果输出为零,则使用 os.Stderr 。
func (*FlagSet) String(显示源代码)
func (f *FlagSet) String(name string, value string, usage string) *string
字符串定义了一个具有指定名称,缺省值和用法字符串的字符串标志。返回值是存储标志值的字符串变量的地址。
func (*FlagSet) StringVar(显示源代码)
func (f *FlagSet) StringVar(p *string, name string, value string, usage string)
StringVar 定义了一个具有指定名称,默认值和用法字符串的字符串标志。参数 p 指向一个字符串变量,用于存储标志的值。
func (*FlagSet) Uint(显示源代码)
func (f *FlagSet) Uint(name string, value uint, usage string) *uint
Uint 定义一个具有指定名称,默认值和用法字符串的 uint 标志。返回值是存储标志值的 uint 变量的地址。
func (*FlagSet) Uint64(显示源代码)
func (f *FlagSet) Uint64(name string, value uint64, usage string) *uint64
Uint64 定义了一个具有指定名称,默认值和用法字符串的 uint64 标志。返回值是存储标志值的 uint64 变量的地址。
func (*FlagSet) Uint64Var(显示源代码)
func (f *FlagSet) Uint64Var(p *uint64, name string, value uint64, usage string)
Uint64Var 定义了一个具有指定名称,默认值和用法字符串的 uint64 标志。参数 p 指向一个 uint64 变量,用于存储标志的值。
func (*FlagSet) UintVar(显示源代码)
func (f *FlagSet) UintVar(p *uint, name string, value uint, usage string)
UintVar 定义了一个具有指定名称,默认值和用法字符串的 uint 标志。参数 p 指向一个存储标志值的 uint 变量。
func (*FlagSet) Var(显示源代码)
func (f *FlagSet) Var(value Value, name string, usage string)
Var 定义了一个具有指定名称和用法字符串的标志。标志的类型和值由 Value 类型的第一个参数表示,它通常包含 Value 的用户定义实现。例如,调用者可以创建一个标志,通过为切片提供 Value 的方法来将逗号分隔的字符串转换为一段字符串;特别是 Set 会将逗号分隔的字符串分解成片。
func (*FlagSet) Visit(显示源代码)
func (f *FlagSet) Visit(fn func(*Flag))
Visit 按照字典顺序访问标志,为每个标志调用 fn 。它只访问已设置的标志。
func (*FlagSet) VisitAll(显示源代码)
func (f *FlagSet) VisitAll(fn func(*Flag))
VisitAll 按字典顺序访问标志,为每个标志调用 fn 。它访问所有的标志,甚至没有设置。
type Getter(显示源代码)
Getter 是一个接口,允许检索值的内容。它包装了 Value 接口,而不是其中的一部分,因为它出现在 Go 1 及其兼容性规则之后。此包提供的所有值类型均满足 Getter 接口。
type Getter interface {
Value
Get() interface{}
}
type Value(显示源代码)
值是存储在标志中的动态值的接口。(默认值表示为一个字符串。)
如果值的 IsBoolFlag() bool 方法返回 true,则命令行解析器将使 -name 等同于 -name = true,而不是使用下一个命令行参数。
对于每个存在的标志,集合都以命令行顺序调用一次。标志包可以用一个零值接收者(例如零指针)调用 String 方法。
type Value interface {
String() string
Set(string) error
}