我之前有写过控制台软件,在编写控制台软件时,其中一个环节就是解析命令行参数。由于当初是使用C/C++编写的,所以解析命令行参数也是自己亲手编写,虽然不难,但是实际上兼容性其实不是很高,稍微多打几个字都可能解析不了。如果是用Go语言编写,就可以用flag解决这样的需求。
命令行参数是什么
mysql -u root -p 123456
java -v
以上代码中,-u root -p 123456 和 -v 就是两行代码中的命令行参数,软件在接收到对应参数后,就应当做出相对应的操作,这时就需要代码能够读取命令行参数。
入门示例
func main(){
var name string;
flag.StringVar(&name, "name", "flag示例软件", "帮助信息");
flag.Rarse();
log.Printf("name: %s", name);
}
在该示例中,我们将name变量与name标识位绑定。该代码中最重要的代码是flag.StringVar()函数,它分别代表存储变量、命令行标识位名称、默认值、帮助信息。存储变量指在信息被解析之后所存储的位置。命令行标识位指软件将要对哪些参数做出反应,在入门示例中,该软件只会解析-name 后面的值,并存储到name变量中。默认值就是用户不输入的话变量默认存储什么值。帮助信息就是你在linux系统上你打-help name会显示的内容,负责向用户讲解对应的命令行参数是用来干什么。
flag.Rarse();函数则是让go语言解析值的。实际上flag.StringVar()只是绑定了,如果不执行flag.Rarse();的话,软件是不会读取值的。
log.Printf()用来输出读取到的值
flag包支持绑定的所有变量类型
flag包共有如下几个函数提供用来绑定变量:
func BoolVar(p *bool, name string, value bool, usage string);
func DurationVar(p *time.Duration, name string, value time.Duration, usage string);
func Float64Var(p *float64, name string, value float64, usage string);
func Int64Var(p *int64, name string, value int64, usage string);
func IntVar(p *int, name string, value int, usage string);
func StringVar(p *string, name string, value string, usage string);
func Uint64Var(p *uint64, name string, value uint64, usage string);
func UintVar(p *uint, name string, value uint, usage string);
他们被提供用来绑定对应类型的变量。
当然flag包也有一类函数,不需要你提供变量来存储读取到的值,他们会自己返回一个变量指针,你只需要访问这些指针所存储的值就行了。 如下:
func Bool(name string, value bool, usage string) *bool
func Duration(name string, value time.Duration, usage string) *time.Duration
func Float64(name string, value float64, usage string) *float64
func Int(name string, value int, usage string) *int
func Int64(name string, value int64, usage string) *int64
func String(name string, value string, usage string) *string
func Uint(name string, value uint, usage string) *uint
func Uint64(name string, value uint64, usage string) *uint64
他们最大的区别就是参数中少了个指针,并且一个没有返回值,一个返回对应的类型指针。 使用方式像这样子:
func main(){
var name string;
flag.StringVar(&name, "name", "flag示例软件", "帮助信息");
age:=flag.Int64("age",18,"帮助文档");
flag.Rarse();
log.Printf("name: %s, age: %d", name, *age);
}