Go flag包的基本使用

官网文档https://studygolang.com/pkgdoc

Go flag包的基本使用

flag包实现了命令行参数的解析。

导包:import "flag"

flag包支持的命令行参数类型有boolintint64uintuint64float float64stringduration

解析参数之前要先注册flag。常见两种用法:

用法一:

flag.Type(name, defValue, usage)

defValue:默认值

usage:用法,描述信息,爱写啥写啥

返回值是对应类型的指针

wordPtr := flag.String("word", "foo", "a string")
numbPtr := flag.Int("num", 42, "an int")
boolPtr := flag.Bool("fork", false, "a bool")
timePtr := flag.Duration("d", 0, "时间间隔")

用法二:

flag.TypeVar(&flagvar, name, defValue, usage)

无返回值

var name string
var height int
var isGay bool
var t time.Duration
flag.StringVar(&name, "name", "dark", "姓名")
flag.IntVar(&height, "height", 176, "身高")
flag.BoolVar(&isGay, "Gay", false, "是否搞基")
flag.DurationVar(&t, "d", 0, "时间间隔")

不管是用哪种用法二,在注册flag后,都需要调用flag.Parse()来对命令行参数进行解析。

命令行flag语法:

-flag
-flag=x
-flag x  // 只有非bool类型的flag可以

可以使用1个或2个'-'号,效果是一样的。最后一种格式不能用于bool类型的flag,因为如果有文件名为0、false等时,如下命令:

cmd -x *

其含义会改变。你必须使用-flag=false格式来关闭一个bool类型flag。

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

整数flag接受1234、0664、0x1234等类型,也可以是负数。bool类型flag可以是:

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

时间段flag接受任何合法的可提供给time.ParseDuration的输入。

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

示例

package main

import (
	"flag"
	"fmt"
	"time"
)

func main() {
	wordPtr := flag.String("word", "foo", "a string")
	numbPtr := flag.Int("num", 42, "an int")
	boolPtr := flag.Bool("fork", false, "a bool")
	timePtr := flag.Duration("duration", 0, "时间间隔")

	var name string
	var height int
	var isGay bool
	var interval time.Duration
	flag.StringVar(&name, "name", "dark", "姓名")
	flag.IntVar(&height, "height", 176, "身高")
	flag.BoolVar(&isGay, "Gay", false, "是否搞基")
	flag.DurationVar(&interval, "interval", 1, "时间间隔")

	//解析命令行参数
	flag.Parse()
	fmt.Println(*wordPtr, *numbPtr, *boolPtr, *timePtr)
	fmt.Println(name, height, isGay, interval)
	//返回命令行参数后的其他参数
	fmt.Println(flag.Args())
	//返回命令行参数后的其他参数个数
	fmt.Println(flag.NArg())
	//返回使用的命令行参数个数
	fmt.Println(flag.NFlag())
}

使用:

PS C:\Users\Dark\GolandProjects\Mytest> go build          
PS C:\Users\Dark\GolandProjects\Mytest> .\Mytest.exe -help
Usage of C:\Users\Dark\GolandProjects\Mytest\Mytest.exe:
  -Gay
        是否搞基
  -duration duration
        时间间隔
  -fork
        a bool
  -height int
        身高 (default 176)
  -interval duration
        时间间隔 (default 1ns)
  -name string
        姓名 (default "dark")
  -num int
        an int (default 42)
  -word string
        a string (default "foo")
PS C:\Users\Dark\GolandProjects\Mytest> .\Mytest.exe
foo 42 false 0s
dark 176 false 1ns
[]
0
0
PS C:\Users\Dark\GolandProjects\Mytest> .\Mytest.exe -Gay=false -duration 300ms --fork=true --name Dark -num=1 --word=haha
haha 1 true 300ms
Dark 176 false 1ns
[]
0
6
PS C:\Users\Dark\GolandProjects\Mytest> .\Mytest.exe -Gay=false -duration 300ms --fork=true --name Dark -num=1 --word=haha a b c d
haha 1 true 300ms
Dark 176 false 1ns
[a b c d]
4
6
posted @ 2022-06-05 01:52  DarkH  阅读(342)  评论(0编辑  收藏  举报