ホームページ > バックエンド開発 > Golang > リフレクションを使用して型パラメータを抽出する方法

リフレクションを使用して型パラメータを抽出する方法

王林
リリース: 2024-02-12 17:24:05
転載
623 人が閲覧しました

リフレクションを使用して型パラメータを抽出する方法

質問の内容

コンテキスト: 2 種類の構造体を受け取り、その構造体の各フィールドに指定されたタグがあるかどうかを確認し、コピーする汎用オートマッパーを作成しています。タグと型が一致していると仮定して、ソース構造からターゲット構造への値。構造体フィールドが別の (ネストされた) 構造体である場合は常に、オートマッパー関数でウサギの穴を自動的にマッピングする再帰呼び出しを実行する必要があります。

問題: ルート構造の具象型のみを渡すことができます。リフレクションを使用してジェネリック関数に入ると、ネストされた構造体型を抽出しようとすることは不可能に思えます。 value.interface() をパラメータとして渡すことはできますが、type パラメータを渡す必要があります。

これは、問題を示すための簡略化されたコードです。

type Alpha struct {
    Nested Beta `automap:"nested"`
}

type Beta struct {
    Info string `automap:"info"`
}

type Foo struct {
    Nested Bar `automap:"nested"`
}

type Bar struct {
    Info string `automap:"info"`
}

func TestAutoMap(t *testing.T) {

    b := Beta{Info: "Hello from Beta!"}
    a := Alpha{Nested: b}

    f, err := AutoMap[Alpha, Foo](a)
    if err != nil {
        fmt.Println(err)
        t.Fail()
    }
    fmt.Println("f.nested.info:", f.Nested.Info)
}

func AutoMap[S, T any](source S) (target T, err error) {

    targetStruct := reflect.ValueOf(&target).Elem()
    sourceStruct := reflect.ValueOf(&source).Elem()

    // .Type and .Kind directly did not work.
    nestedSourceType := ??? // I want this to be type Beta.
    nestedTargetType := ??? // I want this to be type Bar.

    sourceInterface := sourceStruct.Interface()

    t, err := AutoMap[nestedSourceType, nestedTargetType](sourceInterface)
    if err != nil {
        return target, err
    }
    target = t

    return target, nil
}
ログイン後にコピー

解決策

@mkopriva のアドバイスに従って、私が遭遇した問題に対する簡単な解決策を共有したいと思います。 p>

自由に修正または改善してください。ただし、以下のさまざまなチェックやアサーションは意図的に含めていないことに注意してください。

(遊び場の例)

リーリー

以上がリフレクションを使用して型パラメータを抽出する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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