据我所知(请参阅此处和此处)在反射包中没有类型发现机制,它期望您已经拥有要检查的类型或值的实例。
有没有其他方法可以发现正在运行的 go 包中的所有导出类型(尤其是结构)?
这是我希望我拥有的(但它不存在):
import "time"
import "fmt"
func main() {
var types []reflect.Type
types = reflect.DiscoverTypes(time)
fmt.Println(types)
}
最终目标是能够发现满足特定条件的包的所有结构,然后能够实例化这些结构的新实例。
顺便说一句,识别类型的注册函数对于我的用例来说不是有效的方法。
无论您认为这是一个好主意与否,这就是我想要此功能的原因(因为我知道您会问):
我编写了一个代码生成实用程序,它加载 go 源文件并构建一个 AST 来扫描嵌入指定类型的类型。该实用程序的输出是一组基于发现的类型的 go test 函数。我调用此实用程序go generate来创建测试函数,然后运行go test以执行生成的测试函数。每次测试更改(或添加新类型)时,我都必须在重新运行之前重新运行 go generate go test。这就是注册功能不是有效选项的原因。我想避免这go generate一步,但这需要我的实用程序成为由正在运行的包导入的库。init()对于嵌入预期库类型的类型,库代码需要以某种方式扫描正在运行的命名空间。
www说
catspeake
相关分类