ホームページ > バックエンド開発 > Golang > リフレクションを使用して Go で組み込み型とカスタム型を区別するにはどうすればよいですか?

リフレクションを使用して Go で組み込み型とカスタム型を区別するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-12-25 21:11:17
オリジナル
450 人が閲覧しました

How Can We Distinguish Between Built-in and Custom Types in Go Using Reflection?

リフレクションを使用した非組み込み型の識別

問題:

[ ]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
}
ログイン後にコピー

特殊なケース:

  • 匿名構造体型: 構造体フィールドを検査し、カスタム構造体があるかどうかを確認します。 type.
  • マップのタイプ: マップのキーと値のタイプの両方を調べます。

実装例:

次のコードは、非組み込みを識別するユーティリティ関数 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート