首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

flag(命令行参数解析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(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(显示源代码)

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

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

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

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

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

func UnquoteUsage(flag *Flag) (name string, usage string)

UnquoteUsage 从标志的用法字符串中提取一个反引号的名称,并返回它和未加引号的用法。给定“ name显示”它返回(“name”,“a name to show”)。如果没有后引号,则该名称是对标志值类型的合理猜测,如果标志为布尔值,则为空字符串。

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 。它访问所有的标志,甚至没有设置。

type ErrorHandling(显示源代码)

ErrorHandling 定义了解析失败时 FlagSet.Parse 的行为。

type ErrorHandling int

如果解析失败,这些常量会导致 FlagSet.Parse 的行为与所述相同。

const (
        ContinueOnError ErrorHandling = iota // 返回描述性错误。
        ExitOnError                          // 调用 os.Exit(2)。
        PanicOnError                         // 用描述性错误调用panic。
)

一个标志(Flag)表示一个标志的状态。

type Flag struct {
        Name     string // 命令行上显示的名称
        Usage    string // 帮助信息
        Value    Value  // 设定值
        DefValue string // 默认值(作为文本); 用法信息
func Lookup(name string) *Flag

Lookup 返回指定命令行标志的标志结构,如果不存在则返回 nil 。

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 。它访问所有的标志,甚至没有设置。

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
}

扫码关注腾讯云开发者

领取腾讯云代金券