1 回答
TA贡献1891条经验 获得超3个赞
调用ast.NewPackage来解析包名称。您将需要提供一个进口商返回一个* ast.Object对于给定的输入路径。如果您只想将名称解析为路径,导入程序可以简单地返回一个*ast.Object,其中Kind设置为ast.Pkg,Name设置为包的名称。导入器中的大部分繁重工作都可以通过go/build 完成包裹。如果要为目标包解析执行 AST,则需要解析包并返回包的 ast.Object。为了防止多次加载同一个包,请使用导入器的 map 参数作为先前加载的包的缓存。
这是一些未经测试的代码,用于从以下位置查找已解析的包路径*ast.SelectorExpr se:
if x, _ := se.X.(*ast.Ident); x != nil {
if obj := x.Obj; obj != nil && obj.Kind == ast.Pkg {
if spec, _ := obj.Decl.(*ast.ImportSpec); spec != nil {
if path, err := strconv.Unquote(spec.Path.Value); err == nil {
// path is resolved path for selector expression se.
}
}
}
}
该GO /类型的包装,也可用于获取此信息等等。我建议使用 go/types 而不是直接使用 go/ast。
- 1 回答
- 0 关注
- 306 浏览
添加回答
举报