在 golang 的 flag 中自定义参数类型
Golang 的 flag 包能够帮助我们轻松实现一个命令行程序的参数解析,如:
package main import ( "flag" "fmt" ) func main() { debug := flag.Bool("verbose", false, "Verbose log output.") name := flag.String("name", "", "your Name") flag.Parse() fmt.Println(*debug) fmt.Println(*name) }
这个时候运行就可以看到我们命令行的参数:
Flag 是不区分短选项和长选项的(即不区分 flag、option、arguments 这些概念 https://unix.stackexchange.com/questions/285575/whats-the-difference-between-a-flag-an-option-and-an-argument)
Flag 只支持简单的参数类型(bool、int、string),如果要使用复杂一些的类型,就需要自己去实现 Value 接口:
type Value interface { String() string Set(string) error }
其中String方法格式化该类型的值,flag.Parse方法在执行时遇到自定义类型的选项会将选项值作为参数调用该类型变量的Set方法。
如最长被使用到的slice类型可以这么定义:
type arrayFlags []string func (i *arrayFlags) String() string { return strings.Join(*i,", ") } func (i *arrayFlags) Set(value string) error { *i = append(*i, value) return nil }
使用的时候使用 flag.Var
var exclusionGlobs arrayFlags flag.Var(&exclusionGlobs, "exclude", "Glob of files that should not be pruned. Can be specified multiple times.")
在命令行中多次指定这个option就可以了,如
cli --exclude arg1 --exclude arg2
再比如使用 map 类型可以类似这样定义:
func (f mapFlag) String() string { return fmt.Sprintf("%v", map[string]string(f)) } func (f mapFlag) Set(value string) error { split := strings.SplitN(value, "=", 2) f[split[0]] = split[1] return nil } func main() { var hostsFlag sliceFlag flag.Var(&hostsFlag, "env", "env list,for example: -env key1=value1 -env key2=value2") }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: node-prune 源码阅读笔记
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论