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 サイトの他の関連記事を参照してください。