リフレクションを使用したネストされた構造のフィールド アドレスの取得
このシナリオでは、ネストされた構造を走査して検査し、非構造体のアドレスを取得します。 -その中のポインターフィールド。リフレクションを使用すると、フィールドを反復処理する関数が作成できますが、埋め込まれた部分構造にある非ポインター フィールドのメモリ アドレスを取得するのが困難になります。
この問題を修正するには、valueField.Interface() が次のことを行うことに注意することが重要です。フィールド内に格納されている実際の値を返すため、期待される結果が得られません。これは、非ポインター型を操作する場合には無効です。
解決策は、InspectStructV 関数を変更して、代わりに Reflect.Value を受け取ることにあります。インターフェース{}。これにより、リフレクション オブジェクトを直接操作し、フィールドのアドレスを取得できるようになります。さらに、構造体フィールドに対して InspectStructV を再帰的に呼び出すと、以前はインターフェイス値を保持していた valueField が、ネストされた構造体のリフレクション値を直接指すようになり、アドレスを正しく取得できるようになります。
修正されたコードは次のとおりです。スニペット:
func InspectStructV(val reflect.Value) {
if val.Kind() == reflect.Interface && !val.IsNil() {
elm := val.Elem()
if elm.Kind() == reflect.Ptr && !elm.IsNil() && elm.Elem().Kind() == reflect.Ptr {
val = elm
}
}
if val.Kind() == reflect.Ptr {
val = val.Elem()
}
for i := 0; i これらの変更を行うことで、非ポインター フィールドがネストされた構造内に存在する場合でも、そのメモリ アドレスを正常に取得できるようになります。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3