動態查找包類型
儘管反射包中缺乏類型發現機制,但存在其他方法來發現導出類型,特別是結構體,在運行時。
轉到 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) } }
1.5 之前的版本
在Go 1.5 之前,ast 套件提供了解決此問題的唯一非hacky 方法。透過編譯原始碼,該套件可以提取類型資訊:
package main import ( "fmt" "go/ast" "go/parser" "go/token" ) func main() { fset := token.NewFileSet() node, err := parser.ParseFile(fset, "time.go", nil, parser.ParseComments) if err != nil { fmt.Printf("error: %s\n", err.Error()) return } ast.Inspect(node, func(n ast.Node) bool { if n, ok := n.(*ast.TypeSpec); ok { fmt.Println(n.Name.Name) } return true }) }
這些技術允許在運行的 Go 套件中發現導出的類型,特別是結構,從而能夠進一步分析和實例化實例。
以上是如何在 Go 中動態發現套件類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!