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

Go Reflection を使用してカスタム型と組み込み型を区別するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-05 03:09:39889ブラウズ

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

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

カスタム型の識別

カスタム型と定義済み型を区別するには、2 つのリフレクションを利用できます。メソッド:

  • Type.PkgPath(): 名前付き型のパッケージ パスを返します。事前定義された型には空のパッケージ パスがあります。
  • Type.Name(): 名前付き型の名前を返します。名前のない型は空の文字列を返します。

カスタム型は空ではないパッケージ パスと空ではない名前を持ちます。逆に、事前定義された型には空のパッケージ パスが含まれます。

特殊なケースの処理

匿名構造体型:

匿名構造体型には名前がありませんが、名前が付いている場合があります。カスタムタイプのフィールド。構造体のフィールドを反復処理し、それらのいずれかがカスタムであるかどうかを確認することで、カスタム タイプを確認できます。

マップ タイプ:

マップ タイプはカスタム キーまたは値を持つことができます。種類。 Type.Elem() を使用して値の型をクエリし、Type.Key() を使用してキーの型をクエリできます。

実装例

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
}

テスト

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

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

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