CXYVIP官网源码交易平台_网站源码_商城源码_小程序源码平台-丞旭猿论坛
CXYVIP官网源码交易平台_网站源码_商城源码_小程序源码平台-丞旭猿论坛
CXYVIP官网源码交易平台_网站源码_商城源码_小程序源码平台-丞旭猿论坛

《GO标准库》之03-使用flag包创建程序接口-免费源码丞旭猿

《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 的文档。

声明:本文部分素材转载自互联网,如有侵权立即删除 。

© 版权声明
THE END
喜欢就支持一下吧
点赞0赞赏 分享
相关推荐
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容