実行時のパッケージの検出可能性
reflect パッケージとは異なり、Go には、明示的に知らなくてもすべての型をクエリできる型検出メカニズムがありません。ここで次のような疑問が生じます:
アクティブな Go パッケージでエクスポートされたすべての型 (特に構造体) を検出する代替方法はありますか?
1 つの理論的解決策は仮説です関数「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 中国語 Web サイトの他の関連記事を参照してください。