首頁  >  文章  >  後端開發  >  如何在 Go 中使用反射檢索指標的欄位值?

如何在 Go 中使用反射檢索指標的欄位值?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-09 07:46:021009瀏覽

How to Retrieve Field Values of Pointers Using Reflection in Go?

使用反射取得指標的欄位值

在本文中,我們將探討在嘗試擷取包含指向的指標的結構體的欄位值時遇到的問題另一個結構體。

考慮這個例子:

type Family struct {
   first string
   last string
}

type Person struct {
   name string
   family *Family
}

想像一下我們有一個帶有指向 Family 的指標的 Person。我們希望使用反射來存取 Family 的最後一個欄位。以下程式碼會失敗並出現錯誤:

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

    if v.Kind() == reflect.Struct {
        fmt.Println("was a struct")
        v = v.FieldByName("family").FieldByName("last")
        fmt.Println(v)
    }
}
遇到的錯誤是:

reflect: call of Reflect.Value.FieldByName on ptr Value
原因這個錯誤是我們試圖在代表指標的reflect.Value上呼叫.FieldByName("family"),而不是它指向的值to.

要解決這個問題,我們需要在呼叫.FieldByName() 之前先間接指向指標值。更正後的程式碼如下所示:

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)
    }
}
透過使用reflect.Indirect()間接取消引用指標值,我們可以存取底層值,然後使用.FieldByName()檢索最後一個欄位。

以上是如何在 Go 中使用反射檢索指標的欄位值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn