我们在终端 shell 下输入命令的时候,往往会看到一个帮助信息,根据帮助信息得知该命令的基本用法,并且含有很多参数,本章就来实现类似的功能。
如何直接获取命令行的参数呢? 系统 os 包提供了 os.Args,它是一个 string 的数组:
funcmain(){
fmt.Println(os.Args)
}
输入命令行 go run main.go macos linux windows,将打印出如下的结果:
[/var/folders/jw/rpyqrcvd6jb5w9v2lq0pnnpw0000gn/T/go-build203870186/b001/exe/main macos linux windows]
可以看出,第一部分是命令本身,第二部分才是参数。
通常典型的一个命令的帮助信息有以下形式:
1. cmd -h
2. cmd –help
3. cm -?
虽然 os.Args 能提供命令行的信息,但如果自行去解析这个参数,那就太复杂了。go 内置的包 flag 可以把这件事做好,flag 包对命令参数的类型做了定义:
1. 布尔命令
2. 字符串
3. 数值
比如打印命令的帮助信息就是一个开关,如果命令行传递了 -h、–help、-? 等就认为是要查看命令的帮助信息,实现方式分为 2 步:
1. 定义绑定命令参数的变量
2. 调用 flag.Parse 解析
funcmain(){
flag.BoolVar(&help,"h",false,"show help")
flag.Parse()
}
flag.BoolVar 表示要绑定 h 命令参数到 help 变量上,第三个参数 false 表示该变量的默认值是 false,如果命令行没有这个参数,help=false,有了 help 变量就好办了,如果 help 为 true,就打印帮助信息,退出:
ifhelp {
usage()return}funcusage(){//}
输入 go run main.go –help 看看显示:
24-parse-cmd-flags[master*]gorun main.go--help
Usage of /var/folders/jw/rpyqrcvd6jb5w9v2lq0pnnpw0000gn/T/go-build694631870/b001/exe/main:
-h show help
自动打印除了 -h 的帮助信息,再加一个绑定 –color 看看效果:
24-parse-cmd-flags[master*]gorun main.go--help
Usage of /var/folders/jw/rpyqrcvd6jb5w9v2lq0pnnpw0000gn/T/go-build632569444/b001/exe/main:
-color
apply color display
-h show help
这是因为默认打印的是 flag.Usage() 函数的结果,因为我们这里的 usage 函数什么都没干,如果需要替换掉 flag.Usage() 默认的帮助信息,可以简单的把 flag.Usage 函数地址换掉就行了:
flag.Usage = usage
flag.Parse()ifhelp{return}
运行 go run main.go –help 显示:
24-parse-cmd-flags[master*]gorunmain.go--help你好,这是自定义帮助信息
这样的帮助信息没有参数用法,可以使用 flag.PrintDefaults() 函数找回来,修改 usage 函数如下:
funcusage(){
fmt.Fprintf(os.Stderr,"你好,这是自定义帮助信息\n")
flag.PrintDefaults()
}
现在运行 go run main.go –help 就完美了:
24-parse-cmd-flags[master*]go run main.go--help
你好,这是自定义帮助信息
-colorapplycolordisplay-h show help
同理,增加一个 hours 参数,并且具有默认是:
flag.IntVar(&hours,"hours",24,"date time mode")// ...ifhours ==24{
fmt.Println("23:59:59")
}else{
fmt.Println("not 24 hours mode")
}
运行 go run main.go 和 go run main.go –hours=24、go run main.go –hours 24 都显示 23:59:59,其他的 hours 参数会则打印提示:
24-parse-cmd-flags[master*]gorunmain.go--hours12not24hoursmode
对于 flag.IntVar 这种指针定义形式,也可以用下面的写法:
varhours = flag.Int("hours",24,"date time mode")
对 string 的绑定使用 flag.StringVar,相信你也会了。需要注意的参数形式是 -flag 形式支持 bool,-flag x 只支持非 bool,而 -flag 都支持。
如果想解析 –fruits “apple,orange,banana” 怎么做呢? 简单,用 StringVar 啊,没错,但是 StringVar 只能得到 fruits=apple,orange,banana,我希望直接解析成切片 fruits=[]string{“apple”, “orange”, “banana”} 怎么办? flag 提供了灵活性,可以使用 flag.Var 来自定义,不过这种自定义的类型必须实现 flag.Value 接口,它的要求是:
typeValueinterface{String()stringSet(string) error
}
实现一个解析 fruits 参数的类型:
typesliceArg []string// 构造函数, def 实现了默认值funcNew(p *[]string, def []string)*sliceArg{
*p = defreturn(*sliceArg)(p)
}func(s *sliceArg)Set(valstring)error{
*s = sliceArg(strings.Split(val,","))returnnil}func(s *sliceArg)String()string{returnstrings.Join(*s,",") }
用法:
flag.Var(New(&fruits, []string{"nothing"}),"fruits","do you like sth")//...fmt.Println(fruits)
现在运行 go run main.go 显示 fruits 的值是 [nothing],而 go run main.go –fruits “apple,orange” 的值的还是 [apple orange],把 “apple,orange” 成功的解析到了 []string 切片类型。
24-parse-cmd-flags[master*]gorunmain.go--fruits"apple,orange"
23:59:59[apple orange]24-parse-cmd-flags[master*]gorunmain.go23:59:59[nothing]
本章节的代码 https://github.com/developdeveloper/go-demo/tree/master/24-parse-cmd-flags
声明:本文部分素材转载自互联网,如有侵权立即删除 。
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别
丞旭猿论坛
暂无评论内容