命令行解析最主要的是针对于选项的解析,gcmd组件提供了Parse方法,用于自定义解析选项,包括有哪些选项名称,每个选项是否带有数值。根据这一配置便可将所有的参数和选项进行解析归类。
gcmd
Parse
大部分场景下,我们并不需要显式创建Parser对象,因为我们有层级管理以及对象管理方式来管理多命令。但底层仍然是采用Parser方式实现,因此本章节大家了解原理即可。
Parser
相关方法:
更多Parser方法请参考接口文档:https://pkg.go.dev/github.com/gogf/gf/v2/os/gcmd#Parser
func Parse(supportedOptions map[string]bool, option ...ParserOption) (*Parser, error) func ParseWithArgs(args []string, supportedOptions map[string]bool, option ...ParserOption) (*Parser, error) func ParserFromCtx(ctx context.Context) *Parser func (p *Parser) GetArg(index int, def ...string) *gvar.Var func (p *Parser) GetArgAll() []string func (p *Parser) GetOpt(name string, def ...interface{}) *gvar.Var func (p *Parser) GetOptAll() map[string]string
其中,ParserOption如下:
ParserOption
// ParserOption manages the parsing options. type ParserOption struct { CaseSensitive bool // Marks options parsing in case-sensitive way. Strict bool // Whether stops parsing and returns error if invalid option passed. }
解析示例:
parser, err := gcmd.Parse(g.MapStrBool{ "n,name": true, "v,version": true, "a,arch": true, "o,os": true, "p,path": true, })
可以看到,选项输入参数其实是一个map类型。其中键值为选项名称,同一个选项的不同名称可以通过,符号进行分隔。比如,该示例中n和name选项是同一个选项,当用户输入-n john的时候,n和name选项都会获得到数据john。
map
,
n
name
-n john
john
而键值是一个布尔类型,标识该选项是否需要解析参数。这一选项配置是非常重要的,因为有的选项是不需要获得数据的,仅仅作为一个标识。例如,-f force这个输入,在需要解析数据的情况下,选项f的值为force;而在不需要解析选项数据的情况下,其中的force便是命令行的一个参数,而不是选项。
-f force
f
force
func ExampleParse() { os.Args = []string{"gf", "build", "main.go", "-o=gf.exe", "-y"} p, err := gcmd.Parse(g.MapStrBool{ "o,output": true, "y,yes": false, }) if err != nil { panic(err) } fmt.Println(p.GetOpt("o")) fmt.Println(p.GetOpt("output")) fmt.Println(p.GetOpt("y") != nil) fmt.Println(p.GetOpt("yes") != nil) fmt.Println(p.GetOpt("none") != nil) // Output: // gf.exe // gf.exe // true // true // false }