《GO标准库》系列文章所涉及代码均在 go1.13.3 版本中验证通过。
前一节提到了一种非常常用的方式来接收程序参数。
本节提供了通过程序标记来定义接口的方式来接收程序参数。这种方法基于 GNU/Linux,BSD,和 macOS 系统。比如在 *UNIX 系统中,调用 ls -l,会列出当前文件夹中的文件。
Go标准库中 flag 不支持处理组合标记,如 ls -ll,这里一个短横线后面有两个标记。每一个标记都应该是独立的。Go 语言中 flag 包同样不区分长选项标记和短选项标记,比如 -flag 和 –flag 是等价的。
代码展示:
packagemainimport("flag""fmt""log""os""strings")// 自定义类型,并实现 flag.Value 接口,// 以支持 flag.Var 函数调用。typeArrayValue[]stringfunc(s*ArrayValue)String()string{returnfmt.Sprintf("%v",*s)}func(a*ArrayValue)Set(sstring)error{*a=strings.Split(s,",")returnnil}funcmain(){// 调用返回指针的函数,解析标记的值retry:=flag.Int("retry",-1,"Defines max retry count")// 使用 XXXVar 函数读取标记值。这里用于接收标记值的变量必须定义在标记之前。varlogPrefixstringflag.StringVar(&logPrefix,"prefix","","Logger prefix")vararrArrayValueflag.Var(&arr,"array","Input array to iterate through.")// 执行 flag.Parse 函数,才会实际将标记值读入定义的变量中。// 如果没有调用这个函数,变量仍为空值。flag.Parse()logger:=log.New(os.Stdout,logPrefix,log.Ldate)retryCount:=0forretryCount<*retry{logger.Println("Retrying connection")logger.Printf("Sending array %v\n",arr)retryCount++}}
编译程序:
go build -o util
运行程序:
./util -retry 2 -prefix=example -array=1,2
输出结果:
example2019/10/31 Retrying connection
example2019/10/31 Sending array [1 2]
example2019/10/31 Retrying connection
example2019/10/31 Sending array [1 2]
详细说明:
通过代码中使用的标记,可以看到 flag 包中定义了两种类型的函数。
第一种是单标记类型名,如 Int 函数。这个函数返回一个指向 Integer 变量的指针,其值为标记对应解析的结果。
第二种是 XXXVar 这样的函数。它提供了一类函数,不过你需要为函数提供指向变量的指针。解析出来的标记值会保存到给定的变量中。
Go 标准库同样支持自定义标记类型,不过自定义的类型需要实现 flag 包中的 Value 接口。
代码示例中,标记 retry 定义了连接到终端的重试次数限制,标记 prefix 定义了每行日志的前缀,标记 array 定义了需要发送到服务器的数组。
在实际使用这些解析到的标记值之前,还有最重要的一点,就是 Parse() 函数,它会将从 Args[1:] 中的参数解析为标记定义。这个函数必须在标记定义之后、接收实际值之前调用。
前面的代码展示了如何从命令行解析一些数据类型。同样,也可以解析其他内置数据类型。
对于代码中最后一个标记 array 的用法,表示可以定义自定义类型的标记。注意,ArrayType 实现了 flag 包中的 Value 接口。
拓展信息:
在 flag 包还设计了很多关于标记的接口,可以阅读一下关于 FlagSet 的文档。
声明:本文部分素材转载自互联网,如有侵权立即删除 。
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别
丞旭猿论坛
暂无评论内容