列出给定导入路径的所有导入类型

我试图在运行时列出给定导入路径中的所有导入类型。示例代码:


package main


import (

    "fmt"

    "go/importer"

)


func main() {

    pkg, err := importer.Default().Import("github.com/aler9/goroslib/pkg/msgs/std_msgs") 

    if err != nil {

        fmt.Println("error:", err)

        return

    }

    for _, declName := range pkg.Scope().Names() {

        fmt.Println(declName)

    }

}


这会导致错误:


错误:找不到导入:“github.com/aler9/goroslib/pkg/msgs/std_msgs”


有可能用戈朗实现我想要的东西吗?


注意:


我知道这篇文章: 如何使用 go 导入程序


通过使用二进制文件返回一些类型,但它们不是我想要的。pkg, err := importer.Default().Import("github.com/aler9/goroslib")


慕桂英4014372
浏览 94回答 1
1回答

慕工程0101907

我不知道如何用 来做,或者即使有可能。go/importer但是,例如,您可以使用包加载包的 AST,然后遍历该树以打印出找到的任何类型声明。golang.org/x/tools/go/packagespackage mainimport (    "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:如果我没有记错的话,您要加载的包必须已经存在于您的模块缓存中,因为包。加载不会通过网络进行,如果它不存在,则下载它。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go