我偶然发现了这个关于如何获取包中所有类型的问题的答案:
https://stackoverflow.com/a/32142080/470339
效果很好。但是,我想采取的下一步是遍历这些类型中的每一个以获得例如NumMethod()
. 我没有看到一个立即明显的方法来做到这一点 - 任何人都可以阐明,还是我不得不求助于弄乱 AST?
我偶然发现了这个关于如何获取包中所有类型的问题的答案:
https://stackoverflow.com/a/32142080/470339
效果很好。但是,我想采取的下一步是遍历这些类型中的每一个以获得例如NumMethod()
. 我没有看到一个立即明显的方法来做到这一点 - 任何人都可以阐明,还是我不得不求助于弄乱 AST?
您可以使用Scope
和 名称来查找Object
您感兴趣的s。
对象描述了一个命名的语言实体,例如包、常量、类型、变量、函数(包括方法)或标签。所有对象都实现 Object 接口。
有一个实现接口的NamedObject
类型,它有一个名为NumMethods
.
package main
import (
"fmt"
"go/importer"
"go/types"
)
func main() {
pkg, err := importer.Default().Import("time")
if err != nil {
fmt.Printf("error: %s\n", err.Error())
return
}
scope := pkg.Scope()
for _, name := range scope.Names() {
if name == "Time" {
obj := scope.Lookup(name)
if tn, ok := obj.Type().(*types.Named); ok {
fmt.Printf("%#v\n", tn.NumMethods())
}
}
}
}
然后,如果你想更进一步,*types.Named
实现Type接口,所以你可以查看它的底层类型,它也是types.Type
由Struct、Slice等实现的。