使用场景
该章节介绍该包的使用场景
当编写go语言程序的时候,一般我们会需要对命令输入参数做解析。flag包为我们提供了官方通用的解析方案。
举个例子: 有一个计算程序calc 要求输入形式如下
calc –n1 123 –n2 456 –op=+ –islog
上面的例子中包含四个参数,n1,n2,op,islog
可以看出参数包含三种格式:
- –flag *
- –flag=*
- –flag
每种参数对应的值(也就是上面的*)需要解析成不同的类型。
比如第三种类型需要解析成bool类型值
根据程序要求,例子中的n1需要解析为整数
op需要解析成字符串
整体架构
本章节主要介绍该包的大体框架
flag包采用builder的模式进行设计。使用解析工厂类(FlagSet)用于参数的解析,工厂类中可以注册多个解析组件(Flag),解析组件用于具体某一项参数的解析,Flag组件通常包含参数名,默认值,提示信息,解析后值几部分内容。flag包中包含多个不同的解析组件,用于解析不同类型的参数。
再注册完解析组件后,执行解析动作(Prase)即可完成解析。
数据结构解析——Flag类
本章节介绍Flag类结构以及使用方法
由于知乎bug,手机无法使用粘贴功能,只能手写,坑……
- Name 保存的是参数名信息
- Usage 帮助信息
- Value 存储值内容
- DefaultValue 默认值信息
Value是接口类型用于具体类型与字符串之间的转换(序列化),flag包中实现了多个类型转换类型。
- boolValue
- intValue
- int64value
- uintvalue
- uint64value
- 等……(太多了后面就不写了,可以直接看源码文件)
数据结构解析——FlagSet类
该类是Flag的集合类,参数如下
- Usage 函数指针,在解析出错的时候执行
- name 名字
- parsed 是否已经解析完成
- actual flag数组,map类型 保存执行解析的解析组件
- formal 保存所有注册的解析组件
- args 参数信息
- errorHandling 遇到错误时如何处理,三个方式,返回错误,错误退出,错误panic
- output 输出类型
流程解析——注册Flag组件
注册Flag组件的核心函数为FlagSet.Var。 由于知乎bug,现在无法粘贴源码。基本上处理流程如下:
- 根据入参信息创建Flag对象
- 将Flag对象保存到formal中
流程解析——参数解析流程
在注册完成后就可以执行参数解析工作了,参数解析的入口函数为FlagSet.Parse。由于知乎bug,无法粘贴代码进来,可以看到核心代码为praseone,该函数用于一个参数的解析工作。从该函数中可以看到切片的灵活,c/c++当然也可以实现类似效果,但是会费劲很多。
流程解析——遍历操作
实际上,截止到上节,flag包的基本功能都分析完了,在解析的时候,执行解析的组件会将本组件放入act数组中。 如果我们对解析组件有遍历操作的诉求的话,act数组大概就是为了满足这种诉求存在的。 该功能的入口函数为,flagset.visiter和visiterall
前者遍历act数组,后者遍历formal数组。
扩展分析——全局参数解析
flag包中默认情况下创建了一个对象,用于操作系统执行时带的入参的解析,基本上flagset的成员函数都封装了一个全局函数与之对应。
扩展分析——扩展Value对象
如果有新的类型需要解析的话,可以实现新的value对象即可,使用时用Flag对象做一下封装~
总结
总体来说,该模块实现相对比较简单,由于无法粘贴源码,很多情况下都只能空口解析。之后有时间再在电脑上补一下吧。
不足的地方,从源码分析来看。该模块的核心功能prase函数应该没有考虑重复执行的场景,重复使用同一个flagset去解析不同的参数,比较容易出幺蛾子……
声明:本文部分素材转载自互联网,如有侵权立即删除 。
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别
丞旭猿论坛
暂无评论内容