目次
質問の内容
解決策
ホームページ バックエンド開発 Golang リフレクションを使用して型パラメータを抽出する方法

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

Feb 12, 2024 pm 05:24 PM
overflow

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

質問の内容

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

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

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

2009 年から 2025 年の誕生以来のビットコインの価格 BTC 過去の価格の最も完全な概要 2009 年から 2025 年の誕生以来のビットコインの価格 BTC 過去の価格の最も完全な概要 Jan 15, 2025 pm 08:11 PM

2009 年から 2025 年の誕生以来のビットコインの価格 BTC 過去の価格の最も完全な概要

Windows 11 の右下隅で時間がなくなった場合の対処方法_Windows 11 の右下隅で時間がなくなった場合の対処方法 Windows 11 の右下隅で時間がなくなった場合の対処方法_Windows 11 の右下隅で時間がなくなった場合の対処方法 May 06, 2024 pm 01:20 PM

Windows 11 の右下隅で時間がなくなった場合の対処方法_Windows 11 の右下隅で時間がなくなった場合の対処方法

Java 関数について質問したり議論したりできるコミュニティ フォーラムやディスカッション グループはありますか? Java 関数について質問したり議論したりできるコミュニティ フォーラムやディスカッション グループはありますか? Apr 28, 2024 pm 02:12 PM

Java 関数について質問したり議論したりできるコミュニティ フォーラムやディスカッション グループはありますか?

Pythonで他の人のコードを使用する方法 Pythonで他の人のコードを使用する方法 May 05, 2024 pm 07:54 PM

Pythonで他の人のコードを使用する方法

win11 コンピューターの時刻が常に間違っている場合はどうすればよいですか? Windows 11コンピュータで間違った時刻を調整する方法 win11 コンピューターの時刻が常に間違っている場合はどうすればよいですか? Windows 11コンピュータで間違った時刻を調整する方法 May 03, 2024 pm 09:20 PM

win11 コンピューターの時刻が常に間違っている場合はどうすればよいですか? Windows 11コンピュータで間違った時刻を調整する方法

Java関数開発における一般的な例外の種類とその修復方法 Java関数開発における一般的な例外の種類とその修復方法 May 03, 2024 pm 02:09 PM

Java関数開発における一般的な例外の種類とその修復方法

CSSでのオーバーフローとはどういう意味ですか CSSでのオーバーフローとはどういう意味ですか Apr 28, 2024 pm 03:15 PM

CSSでのオーバーフローとはどういう意味ですか

Java 関数の再帰呼び出しと例外処理の間にはどのような関係がありますか? Java 関数の再帰呼び出しと例外処理の間にはどのような関係がありますか? May 03, 2024 pm 06:12 PM

Java 関数の再帰呼び出しと例外処理の間にはどのような関係がありますか?

See all articles