英文:
Go AST: get all structs
问题
我想要能够获取所有的结构体。例如,假设我们有以下代码:
type SomeType struct {
// ..
}
type someType2 struct {
//..
}
我们的代码:
structs := getAllStructs(srcPath) // 获取 SomeType 和 someType2
我有一些代码,在 srcPath 中找到所有的 .go 文件,并对其进行 parser.ParseFile
操作。
是否有一种方法可以使用 ast、parser、packages 等等,一次性获取任意作用域下的所有结构体?如果有一个结构体不是包作用域的,我该如何获取函数内部的结构体声明呢?例如:
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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论