首頁 > 後端開發 > Golang > 如何在 Go 中使用反射存取指向結構體的欄位?

如何在 Go 中使用反射存取指向結構體的欄位?

Susan Sarandon
發布: 2024-11-08 04:36:02
原創
910 人瀏覽過

How to Access Fields of a Pointed Struct Using Reflection in Go?

處理Reflect 中的指標值:解決「reflect:在ptr Value 上呼叫reflect.Value.FieldByName」錯誤

在提供的程式碼中,您的資料結構定義的包含一個結構體Family,它作為指標儲存在Person 結構體中。當嘗試使用Reflect 包訪問指向的Family 中的字段時,您會遇到錯誤“reflect:在ptr Value 上調用Reflect.Value.FieldByName。”

理解錯誤

出現此錯誤是因為反射包的FieldByName 函數需要非指標值作為其輸入。當您使用指標 (*Family) 作為 FieldByName 的接收者時,函數會嘗試存取指標本身,而不是它指向的值。

解決問題

要解決此問題,您需要在存取欄位之前間接指標。這可以使用 Reflect 套件的 Indirect 函數來完成:

familyPtr := v.FieldByName("family")
v = reflect.Indirect(familyPtr).FieldByName("last")
登入後複製
  • familyPtr 檢索 family 欄位的 Reflect.Value。
  • Indirect(familyPtr) 取消引用指針,產生實際的 Family 值。
  • FieldByName("last") 然後從取消引用的 Family 值中擷取「last」欄位。

更新的程式碼

這是正確處理指標值的更新程式碼:

func Check(data interface{}) {
    var v = reflect.ValueOf(data)

    if v.Kind() == reflect.Struct {
        fmt.Println("was a struct")
        familyPtr := v.FieldByName("family")
        v = reflect.Indirect(familyPtr).FieldByName("last")
        fmt.Println(v)
    }
}
登入後複製

以上是如何在 Go 中使用反射存取指向結構體的欄位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板