使用反射獲取嵌套結構中的字段地址
在這種情況下,您希望遍歷並檢查嵌套結構並獲取非嵌套結構的位址- 其中的指標欄位。使用反射,您可以擁有一個迭代欄位的函數,但在取得位於嵌入式子結構中的非指標欄位的記憶體位址時遇到困難。
要修正此問題,請務必注意 valueField.Interface() 確實如此不提供預期的結果,因為它會傳回儲存在欄位中的實際值,這在使用非指標類型時無效。
解決方案在於修改InspectStructV 函式接收reflect.Value而不是interface{}。這允許您直接操作反射物件並檢索欄位的位址。另外,當遞歸呼叫struct fields的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