扼要答复:经由过程 AST 。AST( Abstract Syntax Tree ,抽象语法树)许可我们大年夜源代铝闼殪索每个零丁的标识符(node)。下图中你可以看到一个构造类型的AST(简化版):
(构造体的根本的Go ast.Node 表示)
在这棵树中,我们可以检索和把持每个标识符,每个字符串和每个括号等。这些都由 AST 节点表示。例如,我们可以经由过程调换表示它的节点中的名字将字段名称大年夜“Foo”更改为“Bar”。雷同的逻辑也实用于struct标签。
要 获得Go AST ,我们须要解析源文件并将其转换为AST。实际上,这两者都是经由过程一个步调剂理的。
要做到这一点,我们将应用 go/parser 包来 解析 文件以获取(全部文件的)AST,然后应用 go/ast 包来遍历整棵树(我们也可以手动履行, 但这是另一篇博文的主题)。下面代码你可以看到一个完全的例子:
- package main
- import (
- "fmt"
- "go/ast"
- "go/parser"
- "go/token"
- )
- func main() {
- src := `package main
- type Example struct {
- Foo string` + " `json:\"foo\"` }"
- fset := token.NewFileSet()
- file, err := parser.ParseFile(fset, "demo", src, parser.ParseComments)
- if err != nil {
- panic(err)
- }
- ast.Inspect(file, func(x ast.Node) bool {
- s, ok := x.(*ast.StructType)
- if !ok {
- return true
- }
- for _, field := range s.Fields.List {
- fmt.Printf("Field: %s\n", field.Names[0].Name)
- fmt.Printf("Tag: %s\n", field.Tag.Value)
- }
- return false
- })
- }
膳绫擎代码输出如下:
- Field: Foo
- Tag: `json:"foo"`
推荐阅读
前人有云,“一言既出,驷马难追”,可见对说出口的话,是多么看重。可是,人总有说错话的时刻啊!为懂得决“手滑”的懊末路,微信在5.3.1.16版本中上线了“微信撤回”的>>>详细阅读
本文标题:用Go语言编写一门工具的终极指南
地址:http://www.17bianji.com/lsqh/38247.html
1/2 1