リフレクションを使用して型パラメータを抽出する方法
Feb 12, 2024 pm 05:24 PM質問の内容
コンテキスト: 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 サイトの他の関連記事を参照してください。

人気の記事

人気の記事

ホットな記事タグ

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











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

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

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

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

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