1 回答

TA贡献1887条经验 获得超5个赞
我不知道如何用 来做,或者即使有可能。go/importer
但是,例如,您可以使用包加载包的 AST,然后遍历该树以打印出找到的任何类型声明。golang.org/x/tools/go/packages
package main
import (
"fmt"
"go/ast"
"go/token"
"golang.org/x/tools/go/packages"
)
func main() {
loadConfig := new(packages.Config)
loadConfig.Mode = packages.NeedSyntax
loadConfig.Fset = token.NewFileSet()
pkgs, err := packages.Load(loadConfig, "encoding/json")
if err != nil {
panic(err)
}
for _, pkg := range pkgs {
for _, syn := range pkg.Syntax {
for _, dec := range syn.Decls {
if gen, ok := dec.(*ast.GenDecl); ok && gen.Tok == token.TYPE {
for _, spec := range gen.Specs {
if ts, ok := spec.(*ast.TypeSpec); ok {
fmt.Println(ts.Name)
}
}
}
}
}
}
}
注意#1:上面的示例将打印导出和未导出的类型。如果只想打印导出,则可以添加 if 条件来检查 ts。名称.已导出。
注意#2:如果我没有记错的话,您要加载的包必须已经存在于您的模块缓存中,因为包。加载不会通过网络进行,如果它不存在,则下载它。
- 1 回答
- 0 关注
- 93 浏览
添加回答
举报