作家
登录

用Go语言编写一门工具的终极指南

作者: 来源: 2017-10-26 13:08:22 阅读 我要评论

扼要答复:经由过程 AST 。AST( Abstract Syntax Tree ,抽象语法树)许可我们大年夜源代铝闼殪索每个零丁的标识符(node)。下图中你可以看到一个构造类型的AST(简化版):

用Go说话编写一门对象的最终指南

用Go说话编写一门对象的最终指南


(构造体的根本的Go ast.Node 表示)

在这棵树中,我们可以检索和把持每个标识符,每个字符串和每个括号等。这些都由 AST 节点表示。例如,我们可以经由过程调换表示它的节点中的名字将字段名称大年夜“Foo”更改为“Bar”。雷同的逻辑也实用于struct标签。

要 获得Go AST ,我们须要解析源文件并将其转换为AST。实际上,这两者都是经由过程一个步调剂理的。

要做到这一点,我们将应用 go/parser 包来 解析 文件以获取(全部文件的)AST,然后应用 go/ast 包来遍历整棵树(我们也可以手动履行, 但这是另一篇博文的主题)。下面代码你可以看到一个完全的例子:

  1. package main 
  2.  
  3. import ( 
  4.     "fmt" 
  5.     "go/ast" 
  6.     "go/parser" 
  7.     "go/token" 
  8.  
  9. func main() { 
  10.     src := `package main 
  11.         type Example struct { 
  12.     Foo string` + " `json:\"foo\"` }" 
  13.  
  14.     fset := token.NewFileSet() 
  15.     file, err := parser.ParseFile(fset, "demo", src, parser.ParseComments) 
  16.     if err != nil { 
  17.         panic(err) 
  18.     } 
  19.  
  20.     ast.Inspect(file, func(x ast.Node) bool { 
  21.         s, ok := x.(*ast.StructType) 
  22.         if !ok { 
  23.             return true 
  24.         } 
  25.  
  26.         for _, field := range s.Fields.List { 
  27.             fmt.Printf("Field: %s\n", field.Names[0].Name
  28.             fmt.Printf("Tag:   %s\n", field.Tag.Value) 
  29.         } 
  30.         return false 
  31.     }) 

膳绫擎代码输出如下:

  1. Field: Foo  
  2. Tag: `json:"foo"

      推荐阅读

      微信消息撤回为啥只有2分钟?恍然大悟

    前人有云,“一言既出,驷马难追”,可见对说出口的话,是多么看重。可是,人总有说错话的时刻啊!为懂得决“手滑”的懊末路,微信在5.3.1.16版本中上线了“微信撤回”的>>>详细阅读


    本文标题:用Go语言编写一门工具的终极指南

    地址:http://www.17bianji.com/lsqh/38247.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)