リフレクションを使用した非組み込み型の識別
問題:
[ ]byte とリフレクションを使用したタイプ A []byte は、次の場合に困難であることがわかります。 reflect.TypeOf(A{}).Kind は両方をバイトのスライスとして示します。事前に定義された型のリストに依存せずにこれらの型を区別する方法を見つけることが必要になります。
背景:
Go の型は名前付き (型名付き) または名前なし (型リテラルを使用)。事前に宣言された型 (string や int など) には名前が付けられますが、型リテラル ([]int や struct{i int} など) を使用して作成された型には名前がありません。
解決策:
使用中Type.PkgPath():
Type.PkgPath() は、名前付き型のパッケージ パスを提供します。事前に宣言された型または名前のない型の場合、このパスは空になります。したがって、非組み込み型は、Type.PkgPath() が空でない文字列を返すかどうかをチェックすることで識別できます。
カスタム型から派生した名前のない型の処理:
カスタム型で型リテラルを使用すると、名前のない型 ([]A など) が生成される可能性があります。名前のない型がカスタム型から派生したかどうかを判断するには、Type.Elem():
if elem := t.Elem(); elem.Kind() == reflect.Ptr || elem.Kind() == reflect.Struct { // Recursively check elem }
特殊なケース:
実装例:
次のコードは、非組み込みを識別するユーティリティ関数 isCustom を定義します。タイプ:func isCustom(t reflect.Type) bool { if t.PkgPath() != "" { return true } // Handle special cases and recursion for unnamed types return false }
ソリューションのテスト:
以上がリフレクションを使用して Go で組み込み型とカスタム型を区別するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。