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

标签 go types

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

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)
    }
}

这会导致错误:

error: can't find import: "github.com/aler9/goroslib/pkg/msgs/std_msgs"

用Golang可以实现我想要的吗?


注意:

我知道这个帖子:How to use go importer

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


最佳答案

我不知道如何使用 go/importer 来做到这一点,甚至不知道是否可能。

但是,例如,您可以使用 golang.org/x/tools/go/packages 包加载包的 AST,然后遍历该树以打印出您找到的任何类型声明.

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.Name.IsExported .

注意#2:如果我没记错的话,您要加载的包必须已经在您的模块缓存中,因为 packages.Load如果网络不存在,则不会通过网络进行下载。

关于go - 列出给定导入路径的所有导入类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68794847/

相关文章:

vb6 - 为什么我的 VB6 变体会根据分配时间而变化?

python - 将 python int 转换为 int16_t 类型

c# - Entity Framework 是否提供将 DB 类型转换为 C# 类型的实用程序?

javascript 对象属性类型仅接受数字

bash - os.exec.Command 和 pbcopy

go - 当使用 k8s.io/client-go 库更改 kubernetes 部署时,获得通知的最佳方式是什么?

go - 从 Golang 结构生成序列化器

types - 函数的 Rust HashMap 的类型签名

http - 找不到 https ://github. com/mbanzon/simplehttp golang 模块。它去哪儿了?

unit-testing - 如何在执行所有 go 测试文件之前从 .yaml 文件加载配置?