相关疑难解决方法(0)

如何在运行时发现所有包类型?

据我所知(参见此处此处),反射包中没有类型发现机制,期望您已经拥有要检查的类型或值的实例.

有没有其他方法可以在run go包中发现所有导出的类型(特别是结构)?

这是我希望的(但它不存在):

import "time"
import "fmt"

func main() {
    var types []reflect.Type
    types = reflect.DiscoverTypes(time)
    fmt.Println(types)
}
Run Code Online (Sandbox Code Playgroud)

最终目标是能够发现满足特定条件的包的所有结构,然后能够实例化这些结构的新实例.

顺便说一句,标识类型的注册函数不是我的用例的有效方法.


无论你认为这是一个好主意,这就是我想要这种能力的原因(因为我知道你会问):

我编写了一个代码生成实用程序,它可以加载源文件并构建一个AST来扫描嵌入指定类型的类型.该实用程序的输出是基于发现的类型的一组go测试函数.我调用此实用程序go generate来创建测试函数然后运行go test以执行生成的测试函数.每次测试更改(或添加新类型)时,我必须在重新运行之前重新运行go generate go test.这就是注册功能不是有效选项的原因.我想避免这go generate一步,但这需要我的实用程序成为一个由正在运行的包导入的库.init()对于嵌入了预期库类型的类型,库代码需要以某种方式扫描正在运行的命名空间.

reflection go

15
推荐指数
2
解决办法
5302
查看次数

标签 统计

go ×1

reflection ×1