运行时包的可发现性
与反射包不同,Go 缺乏类型发现机制,允许在不明确知道类型的情况下查询所有类型。这就提出了一个问题:
是否有替代方法来发现活动 Go 包中的所有导出类型(特别是结构)?
一个理论解决方案是假设的函数“DiscoverTypes”,接受一个包并返回所有发现的类型。但是,reflect 包中不存在此功能。
寻找解决方案
在 Go 1.5 及更高版本中,新引入的包类型和导入器提供了一种方法检查二进制文件和源代码包。通过使用以下代码,您可以发现包中的所有导出类型:
package main import ( "fmt" "go/importer" ) func main() { pkg, err := importer.Default().Import("time") if err != nil { fmt.Printf("error: %s\n", err.Error()) return } for _, declName := range pkg.Scope().Names() { fmt.Println(declName) } }
但是,在 1.5 之前的版本中,唯一可靠的方法是使用 ast 包来编译源代码。
真实用例
此功能在识别和识别代码的代码生成实用程序中特别有用。实例化满足特定标准的类型。这些实用程序有助于根据发现的类型生成测试函数,并减少手动代码生成步骤的需要。
以上是如何在运行时发现Go包中所有导出的类型?的详细内容。更多信息请关注PHP中文网其他相关文章!