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

型リストを使用せずにリフレクションを使用して Go で非組み込み型を識別するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-27 13:12:12621ブラウズ

How Can We Identify Non-Builtin Types in Go Using Reflection Without Type Listing?

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

質問:

次のような型の区別[]byte と、reflect を使用したタイプ A []byte は共通の課題です。定義されたチェック対象のタイプのリストに依存せずに、これらのタイプを区別するにはどうすればよいでしょうか?

はじめに:

タイプの背景:
Go の型の分類を理解することは非常に重要です。名前付きタイプと名前なしタイプの 2 つの主なカテゴリがあります。名前付き型は type キーワードを使用して宣言されますが、名前のない型は型リテラルを使用して作成されます。 int や string などの事前に宣言された型もすぐに使用できます。

Type.Name() および Type.PkgPath() の使用:

Type.Name () は名前付き型の名前を返し、Type.PkgPath() は名前付き型と事前宣言型の両方のパッケージ パスを返します。これにより、名前のない型 (空​​の Type.Name()) を名前付きの事前宣言された型から分離することができます。

特殊なケース:

匿名の構造体型とマップ型には特別な特殊な処理が必要です。考慮。匿名構造体型にはカスタム型のフィールドを含めることができるため、Type.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
}

使用法:

さまざまなタイプで isCustom() 関数をテストできます:

fmt.Println(isCustom(reflect.TypeOf(int(2))))            // false
fmt.Println(isCustom(reflect.TypeOf(A{})))               // true
fmt.Println(isCustom(reflect.TypeOf(map[K]int{})))       // true

以上が型リストを使用せずにリフレクションを使用して Go で非組み込み型を識別するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。