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

示例

包文件

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(显示源代码)

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 }