パッケージ型の動的検索
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) } }
1.5 より前のバージョン
Go 1.5 より前では、ast パッケージはこの問題に対する唯一の非ハックなアプローチを提供します。 。ソース コードをコンパイルすることで、このパッケージは型情報を抽出できます。
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 中国語 Web サイトの他の関連記事を参照してください。