NotePublic/Software/Development/Language/Go/Package/Go_语言_flag_包基本使用.md

4.1 KiB

Go 语言 flag 包基本使用

1.导入 flag 包

import flag

2.flag 参数类型

flag 包支持的命令行参数类型有 bool、int、int64、uint、uint64、floatfloat64、string、duration。

flag 参数 有效值
字符串 flag 合法字符串
整数 flag 1234、0664、0x1234 等类型,也可以是负数。
浮点数 flag 合法浮点数
bool 类型 flag 1, 0, t, f, T, F, true, false, TRUE, FALSE, True, False。
时间段 flag 任何合法的时间段字符串。如”300ms”、”-1.5h”、”2h45m”。合法的单位有”ns”、”us” /“µs”、”ms”、”s”、”m”、”h”。

3.定义命令行 flag 参数

有以下两种常用的定义命令行 flag 参数的方法。

3.1.flag.Type

基本格式如下:

flag.Type(flag名, 默认值, 帮助信息)

例如我们要定义姓名、年龄、婚否三个命令行参数,我们可以按如下方式定义:

name := flag.String("name", "张三", "姓名")
age := flag.Int("age", 18, "年龄")
married := flag.Bool("married", false, "婚否")
delay := flag.Duration("d", 0, "时间间隔")

需要注意的是,此时 name、age、married、delay 均为对应类型的指针。

3.2.flag.TypeVar

基本格式如下:

flag.TypeVar(Type指针, flag名, 默认值, 帮助信息)

例如我们要定义姓名、年龄、婚否三个命令行参数,我们可以按如下方式定义:

var name string
var age int
var married bool
var delay time.Duration
flag.StringVar(&name, "name", "张三", "姓名")
flag.IntVar(&age, "age", 18, "年龄")
flag.BoolVar(&married, "married", false, "婚否")
flag.DurationVar(&delay, "d", 0, "时间间隔")

3.3.flag.Parse

通过以上两种方法定义好命令行 flag 参数后,需要通过调用 flag.Parse() 来对命令行参数进行解析。

支持的命令行参数格式有以下几种:

  • -flag xxx (使用空格,一个-符号)
  • --flag xxx (使用空格,两个-符号)
  • -flag=xxx (使用等号,一个-符号)
  • --flag=xxx (使用等号,两个-符号)

其中,布尔类型的参数必须使用等号的方式指定。

Flag 解析在第一个非 flag 参数(单个”-“不是 flag 参数)之前停止,或者在终止符”–“之后停止。

3.4.flag.Usage

golang 编译的二进制文件的 help 输出实质上 是调用的 flag.Usage() 方法, 而该方法是一个变量, 接受一个闭包, 源码如下:

// <go src>/src/flag/flag.go:580
var Usage = func() {
    fmt.Fprintf(CommandLine.Output(), "Usage of %s:\n", os.Args[0])
    flag.PrintDefaults()
}

所以你可以直接覆盖掉 flag的 Usage 方法来修改, 例如这样:

package main

import (
    "flag"
    "fmt"
)

func usage() {
  fmt.Println("nginx version v1.12")
  flag.PrintDefaults()
}

func main() {
    flag.Usage = usage
    flag.Parse()
}

3.5.flag 其他函数

flag.Args()     // 返回命令行参数后的其他参数,以 []string 类型
flag.NArg()     // 返回命令行参数后的其他参数个数
flag.NFlag()    // 返回使用的命令行参数个数

4.完整示例

源码如下:

func main() {
    //定义命令行参数方式1
    var name string
    var age int
    var married bool
    var delay time.Duration
    flag.StringVar(&name, "name", "张三", "姓名")
    flag.IntVar(&age, "age", 18, "年龄")
    flag.BoolVar(&married, "married", false, "婚否")
    flag.DurationVar(&delay, "d", 0, "延迟的时间间隔")

    //解析命令行参数
    flag.Parse()
    fmt.Println(name, age, married, delay)
    //返回命令行参数后的其他参数
    fmt.Println(flag.Args())
    //返回命令行参数后的其他参数个数
    fmt.Println(flag.NArg())
    //返回使用的命令行参数个数
    fmt.Println(flag.NFlag())
}

使用如下:

# Help
$ ./flag_demo -help
Usage of ./flag_demo:
  -age int
        年龄 (default 18)
  -d duration
        时间间隔
  -married
        婚否
  -name string
        姓名 (default "张三")
# Demo
$ ./flag_demo -name 小明 --age 18 -married=false -d=1h30m
小明 18 false 1h30m0s
[]
0
4