因为 fileset 用于自力地为每个文件存储每个节点的地位信息。这将在今后对于获得ast.Node切实其实切信息异常有赞助(请留意,ast.Node应用一个紧凑的地位信息,称为token.Pos。要获取更多的信息,它须要经由过程token.FileSet.Position()函数来获取一个token.Position,个中包含更多的信息)
让我们持续。如不雅经由过程 stdin 传递源文件,它会变得加倍有趣。config.modified 字段是易于测试的 io.Reader ,但实际上我们经由过程 stdin 传递它。我们若何检测是否须要大年夜 stdin 攫取呢?
我们询问用户是否 想 经由过程 stdin 传递内容。在这种情况下,本对象的用户须要传递--modified 标记(这是一个 布尔 标记)。如不雅用户传递了该标记,我们只需将 stdin 分派给 c.modified 即可:
- flagModified = flag.Bool("modified", false,
- "read an archive of modified files from standard input")
- if *flagModified {
- cfg.modified = os.Stdin
- }
如不雅你再次检查膳绫擎的 config.parse() 函数,你将看到我们检查 .modified 字段是否已分派,因为 stdin 是一个随便率性数据的流,我们须要可以或许根据给定的协定对其进行解析。在这种情况下,我们假定个中包含以下内容:
- 文件名,后跟换行符
- (十进制)文件大年夜小,后跟换行符
- 文件的内容
因为我们知道文件大年夜小,我们可以毫无问题地解析此文件的内容。任何大年夜于给定文件大年夜小的部分,我们仅需停止解析。
这种 办法 也被其他几种对象所应用(如 guru、gogetdoc 等),并且它对编辑器来说是异常有效的。因为如许可以让编辑器传递修改后的文件内容, 并且无需保存到文件体系中 。是以它被定名为“modified”。
既然我们已经拥有了 Node ,让我们持续下一步的“查找构造体”:
我们的主函数中,我们将应用在上一步中解析的 ast.Node 中调用 findSelection() 函数:
- func main() {
- // ... parse file and get ast.Node
- start, end, err := cfg.findSelection(node)
- if err != nil {
- return err
- }
- // continue rewriting the node with the start&end position
- }
cfg.findSelection() 函数会根据设备文件和我们选定构造体的方法来返回指定构造体的开端和停止地位。它在给定 Node 长进行迭代,然后返回其肇端地位(和以上的设备一节中的解释类似):
(检索步调会迭代所有 node ,直到颇┞芬到一个 *ast.StructType ,然后返回它在文件中的肇端地位。)
推荐阅读
前人有云,“一言既出,驷马难追”,可见对说出口的话,是多么看重。可是,人总有说错话的时刻啊!为懂得决“手滑”的懊末路,微信在5.3.1.16版本中上线了“微信撤回”的>>>详细阅读
本文标题:用Go语言编写一门工具的终极指南
地址:http://www.17bianji.com/lsqh/38247.html
1/2 1