构造体的标签 值 (其内容,比如`json:"foo"`)并 不是官方标准的一部分 ,不过,存在一个非官方的规范,应用 reflect 包定义了其格局,这种办法也被 stdlib(例如 encoding/ json)包所采取。它是经由过程 reflect.StructTag 类型定义的:
膳绫擎代码履行以下操作:
- 我们定义下场包含一个构造体的有效Go包的实例。
- 我们应用 go/parser 包来解析这个字符串。解析器包也可以大年夜磁盘攫取文件(或全部包)。
- 在我们解析之后,我们保存我们的节点(分派给变量文件)并查找由 *ast.StructType 定义的AST节点(拜见AST映像作为参考)。遍历树是经由过程ast.Inspect()函数完成的。它会遍历所有节点,直到它收到false值。这是异常便利的,因为它不须要知道每个节点。
- 我们打印构造体的字段名称和构造标签。
我们如今可以完成 两件重要的工作了 ,起首,我们知道若何 解析一个 Go 源文件 并检索个中构造体的标签(经由过程go/parser)。其次,我们知道 若何解析 Go 构造体标签 ,并根据须要进行修改(经由过程 github.com/fatih/structtag )。
既然我们有了这些,我们可以经由过程应用这两个重要的代码片段开端构建我们的对象(名为 gomodifytags )。该对象应次序履行以下操作:
- 获取设备,以辨认我们要修改哪个构造体
- 根据设备查找和修改构造体
- 输出结不雅
因为 gomodifytags 将重要由编辑器来履行,我们计算经由过程 CLI 标记传递设备信息。第二步包含多个步调,如解析文件、找到精确的构造体,然后修改构造(经由过程修改 AST 完成)。最后,我们将输出结不雅,或是按照原始的 Go 源文件或是某种自定义协定(如 JSON,稍后再说)。
以下是 gomodifytags 简化之后的重要功能:
让我们开端具体解释每个步调。为了坚削发单,我将测验测验以萃取情势解释重要的部分。尽管一切都是一样的,一旦你读完了这篇博文,你将可以或许在无需任何指导的情况下通读全部源代码(你将会在本指南的最后找到所有资本)
让我们大年夜第一步开端,懂得若何 获取设备 。以下是我们的设备文件,个中包含所有的须要信息
- type config struct {
- // first section - input & output
- file string
- modified io.Reader
- output string
- write bool
- // second section - struct selection
- offset int
- structName string
- line string
- start, end int
- // third section - struct modification
- remove []string
- add []string
- override bool
- transform string
- sort bool
- clear bool
- addOpts []string
- removeOpts []string
- clearOpt bool
- }
它分为 三个 重要部分:
第一部分包含有关若何和哪个文件要读入的设备。这可所以本地文件体系的文件名,也可所以直接来自stdin的数据(重要用在编辑器中)。它还设置了若何输出结不雅(Go源文件或JSON情势),以及我们是否应当覆写文件,而不是输出到stdout中。
推荐阅读
前人有云,“一言既出,驷马难追”,可见对说出口的话,是多么看重。可是,人总有说错话的时刻啊!为懂得决“手滑”的懊末路,微信在5.3.1.16版本中上线了“微信撤回”的>>>详细阅读
本文标题:用Go语言编写一门工具的终极指南
地址:http://www.17bianji.com/lsqh/38247.html
1/2 1