-
预习:
- option包使用了struct的tag来定义命令行参数
- tag的格式如下: cmd:"[flag名称...][,switch|option,默认参数]"
- 其中各个字段的含义解释如下:
- flag名称,是出现在命令行中,解释为本flag的字符串,可以不带前缀的短横'-'
- flag名称可以有多个,如果不写flag名称,则自动解析为当前结构中字段的名称
- tag中的名称不带'-'时,按照单字符增加单个'-',多字符增加双'-'的规则
- 如果要指定不同的'-'前缀,可以明确写在tag中
- switch表示该flag是个开关,即之后不会跟flag的参数,如果不指定为switch,命令行中该flag之后的参数,会作为该flag的参数
- switch同时隐含了option,同时要求flag类型为bool,不得为其他类型
- option表示该flag是可选的,不一定会出现在命令行中,但同时必须在option之后增加默认参数
- 还有一个tag: usage:"flag说明文字"
- usage的使用会在usage完善的时候用到,即可以通过Parser的Usage方法,输出一段命令行参数说明
-
创建Parser:
option.NewParser
示例:
opt, _ := option.NewParser()
- 绑定
CommandParser.Bind
示例:
type flag_value struct {
Host string `cmd:"H,option,localhost"`
Port int `cmd:"P"`
}
t := flag_value{}
opt.Bind(reflect.TypeOf(t))
- 可以把NewParser和Bind结合起来
示例:
type flag_value struct {
Host string `cmd:"H,option,localhost"`
Port int `cmd:"port,P"`
}
t := flag_value{}
opt, _ := option.NewParser(reflect.TypeOf(t))
- 解析
CommandParser.Parse
示例:
opt.Parse()
或者自己输入数组来解析:
opt.Parse([]string{"-H", "192.168.1.1", "--port", "12345"})
- 获取结果
CommandParser.Get
示例:
type flag_value struct {
Host string `cmd:"H,option,localhost"`
Port int `cmd:"P"`
}
t := flag_value{}
opt := option.NewParser(reflect.TypeOf(t))
opt.Get(&t)
每一步都会有error的返回值,应该检查该返回值,确保正确之后进行下一步操作
- NewParser如果不带参数,不会产生错误,如果有参数,等同于调用了一次Bind,会有错误返回
- Bind如果tag解析出错,tag设置出错等,都会返回错误
- Parser如果命令行参数输入的不正确,会返回错误
- Get获取时的数据类型不符,会返回错误
- 增加命令行参数,非flag的解析
- 增加Usage的显示
- 增加对重复flag的处理,处理为数组格式
- 增加更多的配置选项,比如是否接手重复flag等
- 增加flag的顺序检查
- 增加struct之外的单个flag的设置和获取方法
- 此时准备发布成1.0.0