運行時包的可發現性
與反射包不同,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中文網其他相關文章!