flag包命令行参数

Go标准库flag包基础用法

Go语言内置的flag包实现了命令行参数的解析,flag包使得开发命令行工具更为简单。说白了就是命令行输入命令后面的那个参数的解析。

os.Args

如果只是简单的随便带一个参数用os.Args就行。要使用os.Args先引入os包。os.Args是一个[]string字符串切片。

func main() {
    if len(os.Args) > 0 {
        for i, v := range os.Args {
            fmt.Printf("遍历os.Args切片:\n os.Args[%d]='%s'\n", i, v)
        }
    }
}

上面代码输入go run main.go abcd bbs后运行结果如下:

☁ go run main.go abcd bbs

遍历os.Args切片:
os.Args[0]=’/data/data/com.termux/files/usr/tmp/go-build002182286/b001/exe/main’
遍历os.Args切片:
os.Args[1]=’abcd’
遍历os.Args切片:
os.Args[2]=’bbs’

os.Args是一个切片,第一个元素也就是索引是0的那个元素保存的是路径,程序所在的路径。其它元素和输入命令时的参数一一对应。比如索引为1的第二个元素就是abcd了。使用方便,简单。功能略少。

flag包的基本使用

flag包基本使用:这里简单介绍一下flag包的常用函数和基本使用方法。

flag支持的数据类型

flag包支持的命令行参数类型有boolintint64uintuint64floatfloat64stringduration。具体可以看下表。

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”。

定义falg命令行参数

定义falg命令行参数,有两种常用的定义flag命令行参数的方法

flag.Type()基本格式如下:
flag.Type(flag名,默认值,帮助信息)*Type

例如要定义nameagemarrieddelay四个参数:

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

注意,这里的name,age,married,delay都是对应类型的指针。

flag.TypeVar()

flag.TypeVar()定义命令行参数,首先声明一个存储参数数据的变量,然后使用

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

例如要定义name,age,married,delay等参数:

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",true,"婚否")
flag.DurationVar(&delay,"delay",1h30m58s,"时间间隔")

命令行参数的解析

通过以上方法定义好命令行参数以后,需要使用flag.Parse()来对参数解析。支持命令行参数格式有一下几种:

  • -flag xxx
  • –flag xxx
  • -flag=xxx
  • –flag=xxx

其中,布尔类型的参数必须使用等号的方式指定。
Flag解析在第一个非flag参数(单个”-“不是flag参数)之前停止,或者在终止符”-“之后停止。

完整示例:

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())
}

flag其他函数简单介绍:

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

help使用:

☁  flag  go run main.go -help

运行结果:

Usage of /data/data/com.termux/files/usr/tmp/go-build113043422/b001/exe/main:
-age int
年龄 (default 18)
-d duration
时间间隔
-married
婚否
-name string
姓名 (default “张三”)
exit status 2

正常使用flag参数:

☁  flag  go run main.go -age 38 --name 二蛋 -married=false --d=3h18m2s

运行结果:

二蛋 38 false 3h18m2s
[]
0
4

注意如下写法:

☁  flag  go run main.go -name aa kdlf skdh -age 20

运行结果:

aa 18 false 0s
[kdlf skdh -age 20]
4
1

flag在遇到第一个非flag参数时停止解析。所以-name aa能正确识别解析,kdlf是错误的写法,flag不能识别,解析停止,后面的-age 20虽然写法正确,但是不能识别了。

完整实例代码:

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())
}

  转载请注明: So Cold flag包命令行参数

 上一篇
用手机学Go语言 用手机学Go语言
Termux是一个Android下一个高级的终端模拟器,开源且不需要root,支持apt管理软件包,十分方便安装软件包,完美支持Golang、Python、PHP、Ruby、Nodejs、MySQL等。随着智能设备的普及和性能的不断提升,如
2020-05-30
下一篇 
GO语言文件操作 GO语言文件操作
打开和关闭文件打开和关闭文件,os.Open()能够打开一个文件,返回*File和err。对得到的文件实例调用close()方法能够关闭文件。 func main() { //以只读方式打开文件,相对路径./1.txt fi
2020-05-17
  目录