为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕桂英4014372 2022-09-19 21:11:18
我试图在运行时列出给定导入路径中的所有导入类型。示例代码:package mainimport (    "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")
查看完整描述

1 回答

?
慕工程0101907

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:如果我没有记错的话,您要加载的包必须已经存在于您的模块缓存中,因为包。加载不会通过网络进行,如果它不存在,则下载它。


查看完整回答
反对 回复 2022-09-19
  • 1 回答
  • 0 关注
  • 93 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号