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

Go の `reflect` パッケージを使用して組み込み型とカスタム型を区別するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-28 20:24:10
オリジナル
263 人が閲覧しました

How Can I Distinguish Between Built-in and Custom Types Using Go's `reflect` Package?

Reflect を使用した非組み込み型の識別

課題

区別する必要がありますタイプ A []byte のようなタイプは、reflect パッケージを使用して []byte から作成します。 reflect.TypeOf(A{}).Kind は両方の型の Slice を返すため、それらを区別するのが困難です。

型の背景

  • 名前付き型は次のとおりです。型宣言を使用して定義されます (例: MyInt int 型)。
  • 名前のない型は型ですリテラル (例: []int、struct{i int})。
  • 事前に宣言された型 (例: string、int) はすぐに使用できます。

アプローチ

リフレクトのメソッドの使用type:

  • Name(): 名前付き型の名前を返します。名前のない型の場合は空です。
  • PkgPath(): 名前付き型のパッケージ パスを返します。事前に宣言された型または名前のない型の場合は空です。
  • Elem(): 配列、チャネル、マップ、ポインター、スライスの要素の型を返します。

特殊なケース

  • 匿名構造体型: フィールドを反復処理し、カスタムをチェックする
  • マップ タイプ: キーと値のタイプの両方を確認します。

実装

func isCustom(t reflect.Type) bool {
    if t.PkgPath() != "" {
        return true
    }

    if k := t.Kind(); k == reflect.Array || k == reflect.Chan || k == reflect.Map ||
        k == reflect.Ptr || k == reflect.Slice {
        return isCustom(t.Elem()) || k == reflect.Map && isCustom(t.Key())
    } else if k == reflect.Struct {
        for i := t.NumField() - 1; i >= 0; i-- {
            if isCustom(t.Field(i).Type) {
                return true
            }
        }
    }

    return false
}
ログイン後にコピー

テスト

これをいろいろなところに応用するとtype:

fmt.Println(isCustom(reflect.TypeOf("")))                // false
fmt.Println(isCustom(reflect.TypeOf(int(2))))            // false
fmt.Println(isCustom(reflect.TypeOf([]int{})))           // false
fmt.Println(isCustom(reflect.TypeOf(struct{ i int }{}))) // false
fmt.Println(isCustom(reflect.TypeOf(&i)))                // false
fmt.Println(isCustom(reflect.TypeOf(map[string]int{})))  // false
fmt.Println(isCustom(reflect.TypeOf(A{})))               // true
fmt.Println(isCustom(reflect.TypeOf(&A{})))              // true
fmt.Println(isCustom(reflect.TypeOf([]A{})))             // true
fmt.Println(isCustom(reflect.TypeOf([][]A{})))           // true
fmt.Println(isCustom(reflect.TypeOf(struct{ a A }{})))   // true
fmt.Println(isCustom(reflect.TypeOf(map[K]int{})))       // true
fmt.Println(isCustom(reflect.TypeOf(map[string]K{})))    // true
ログイン後にコピー

これは、reflect パッケージを効果的に使用して、組み込み型とカスタム型を区別する機能を示しています。

以上がGo の `reflect` パッケージを使用して組み込み型とカスタム型を区別するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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