就我所知(参见here和here),reflect package中没有类型发现机制,它期望您已经拥有要判断的类型或值的实例.
Is there any other way to discover all exported types (especially the structs) in a running go package?
以下是我希望拥有的东西(但它并不存在):
import "time"
import "fmt"
func main() {
var types []reflect.Type
types = reflect.DiscoverTypes(time)
fmt.Println(types)
}
最终目标是能够发现满足特定条件的包的所有 struct ,然后能够实例化这些 struct 的新实例.
顺便说一句,标识类型的注册函数not对于我的用例来说是一个有效的方法.
Whether you think it's a good idea or not, here's why I want this capability (because I know you're going to ask):个
我已经编写了一个code generation utility,它加载GO源文件并构建一个AST来扫描嵌入指定类型的类型.该实用程序的输出是基于发现的类型的一组GO测试函数.我使用go generate
调用该实用程序来创建测试函数,然后运行go test
来执行生成的测试函数.每次测试更改(或添加新类型)时,我必须在重新运行go test
之前重新运行GO GENERATE.这就是注册函数不是有效选项的原因.我希望避免go generate
个步骤,但这需要我的实用程序成为由运行的包导入的库.库代码将需要在init()
期间以某种方式扫描运行的命名空间,以寻找嵌入期望库类型的类型.