Go AST:获取所有结构体

huangapple go评论86阅读模式
英文:

Go AST: get all structs

问题

我想要能够获取所有的结构体。例如,假设我们有以下代码:

type SomeType struct {
    // ..
}

type someType2 struct {
    //..
}

我们的代码:

structs := getAllStructs(srcPath)  // 获取 SomeType 和 someType2

我有一些代码,在 srcPath 中找到所有的 .go 文件,并对其进行 parser.ParseFile 操作。

是否有一种方法可以使用 astparserpackages 等等,一次性获取任意作用域下的所有结构体?如果有一个结构体不是包作用域的,我该如何获取函数内部的结构体声明呢?例如:

func main() {
    
    type someType3 struct {
        //..
    }

}
英文:

I would like to be able to get all structs. For example, assume we have:

type SomeType struct {
    // ..
}

type someType2 struct {
    //..
}

Our code.

structs := getAllStructs(srcPath)  //gets SomeType and someType2

I have some code which finds all .go files in srcPath and does parser.ParseFile on it.

Is there a way using ast, parser, packages, etc... I can get all structs at once at any scope? What if there is a struct which is not package scoped? How can I get struct declarations also inside the function? Like:

func main() {
    
    type someType3 struct {
        //..
    }

}

答案1

得分: 4

解析每个感兴趣的文件。检查文件以查找结构体类型。

fset := token.NewFileSet()
f, err := parser.ParseFile(fset, fileName, nil, 0)
if err != nil {
    log.Fatal(err)
}

// 在这个切片中收集结构体类型。
var structTypes []*ast.StructType

// 使用Inspect函数遍历AST,查找结构体类型节点。
ast.Inspect(f, func(n ast.Node) bool {
    if n, ok := n.(*ast.StructType); ok {
        structTypes = append(structTypes, n)
    }
    return true
})

// 切片structTypes包含文件中的所有*ast.StructTypes。
英文:

Parse each file of interest. Inspect the file to find struct types.

fset := token.NewFileSet()
f, err := parser.ParseFile(fset, fileName, nil, 0)
if err != nil {
	log.Fatal(err)
}

// Collect the struct types in this slice.
var structTypes []*ast.StructType

// Use the Inspect function to walk AST looking for struct
// type nodes.
ast.Inspect(f, func(n ast.Node) bool {
	if n, ok := n.(*ast.StructType); ok {
		 structTypes = append(structTypes, n)
	}
	return true
})

// The slice structTypes contains all *ast.StructTypes in the file.

huangapple
  • 本文由 发表于 2022年7月13日 08:24:43
  • 转载请务必保留本文链接:https://go.coder-hub.com/72959643.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定