Go中flag用法

发布时间 2023-08-14 10:01:58作者: tangjicheng

flag 包实现了命令行标志解析。

使用 flag.String(), Bool(), Int() 等定义标志。
这声明了一个整数标志 -n,存储在指针 nFlag 中,类型为 *int

import "flag"
var nFlag = flag.Int("n", 1234, "help message for flag n")

如果您愿意,您可以使用 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 // 也允许使用双破折号
  • -flag=x
  • -flag x // 仅非布尔标志

可以使用一个或两个破折号;它们是等效的。布尔标志不允许使用最后一种形式,因为如果有一个名为 0、false 等的文件,命令 cmd -x *(其中 * 是一个Unix shell通配符)的含义会改变。您必须使用 -flag=false 形式来关闭一个布尔标志。

标志解析在第一个非标志参数之前停止("-" 是一个非标志参数)或在终止符 "--" 之后停止。

整数标志接受 123406640x1234,并且可以是负的。布尔标志可以是:

1, 0, t, f, T, F, true, false, TRUE, FALSE, True, False

持续时间标志接受任何对 time.ParseDuration 有效的输入。

默认的命令行标志集由顶级函数控制。FlagSet 类型允许定义独立的标志集,例如在命令行接口中实现子命令。FlagSet 的方法与命令行标志集的顶级函数类似。

示例

输出:[此处省略了示例输出]