在go使用中有时候需要对命令行参数进行解析,通常使用os.Args来处理,下面详细分析。
一、os.Args
os.Args是一个string的切片,用来存储所有的命令行参数
var Args []string
Args保管了命令行参数,第一个是程序名。
二、原生方式解析参数
原生的处理思路非常简单,直接使用for range 遍历参数
示例如下:
代码:
func CommandDemo() {
fmt.Println("命令行参数如下:")
for index, val := range os.Args{
fmt.Printf("arg[%d] = %v \n",index, val)
}
}
命令行参数:
main.exe jack china name password 1231 d:/c.txt
测试结果如下:
e:\GoProject\src\go_code\grammar\commandLine\code\main>main.exe jack china name password 1231 d:/c.txt
命令行参数如下:
arg[0] = main.exe
arg[1] = jack
arg[2] = china
arg[3] = name
arg[4] = password
arg[5] = 1231
arg[6] = d:/c.txt
e:\GoProject\src\go_code\grammar\commandLine\code\main>
三、使用Flag包解析参数
原生的方式对解析参数不是特别的方便,特别是带有指定参数形式的命令行。
比如:cmd>main.exe -f c:/aaa.txt -p 200 -u root 这样的形式命令行,go设计者给我们提供了 flag包,可以方便的解析命令行参数,而且参数顺序可以随意。
1、介绍使用的结构体和函数
type Flag
type Flag struct {
Name string // flag在命令行中的名字
Usage string // 帮助信息
Value Value // 要设置的值
DefValue string // 默认值(文本格式),用于使用信息
}
Flag类型代表一条flag的状态。
func String
func String(name string, value string, usage string) *string
String用指定的名称、默认值、使用信息注册一个string类型flag。返回一个保存了该flag的值的指针。
func StringVar
func StringVar(p *string, name string, value string, usage string)
StringVar用指定的名称、默认值、使用信息注册一个string类型flag,并将flag的值保存到p指向的变量。
func Parse
func Parse()
从os.Args[1:]中解析注册的flag。必须在所有flag都注册好而未访问其值时执行。未注册却使用flag -help时,会返回ErrHelp。
2、示例
代码:
func FlagDemo() {
//命令行是:test.exe -u root -p root123 -h localhost -port 8080
var user, pwd, host, port string
flag.StringVar(&user, "u", "user","用户名")
flag.StringVar(&pwd, "p", "123456","密码")
flag.StringVar(&host, "h", "127.0.0.1","IP地址")
flag.StringVar(&port, "port", "80","端口号")
flag.Parse()//解析注册的flag,必须
fmt.Println("flag解析命令行参数如下:")
fmt.Printf("user = %v \n", user)
fmt.Printf("pwd = %v \n", pwd)
fmt.Printf("host = %v \n", host)
fmt.Printf("port = %v \n", port)
}
命令行参数:
test.exe -u root -p root123 -h localhost -port 8080
测试结果:
e:\GoProject\src\go_code\grammar\commandLine\code\main>test.exe -u root -p root123 -h localhost -port 8080
flag解析命令行参数如下:
user = root
pwd = root123
host = localhost
port = 8080
e:\GoProject\src\go_code\grammar\commandLine\code\main>