在運行時公開包裝類型:方法探索
雖然Reflect 套件提供了全面的內省功能,但它需要先了解目標類型或值。這對在正在運行的套件中發現所有導出類型(特別是結構體)提出了挑戰。
但是,隨著 Go 1.5 的出現,出現了一個新的範例:
使用型別和導入器包
在 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) } }
通過迭代導入包的Scope(),我們可以得到所有導出標識符的列表,包括類型名稱。這提供了包的公開類型的全面視圖。
1.5 之前的解決方案:利用ast 套件
在Go 1.5 之前,唯一可靠的方法涉及使用ast打包來編譯原始碼並提取所需的資訊。這是一種更複雜且可能容易出錯的方法。
自訂類型發現的應用程式
在運行時發現套件類型的能力在以下場景中特別有用:您描述的一個:識別和實例化嵌入指定類型的結構。透過利用上述方法,您可以自動化此流程並消除手動更新或註冊功能的需求。
以上是如何在 Go 運行時發現導出的套件類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!