首頁 > 後端開發 > Golang > 如何在 Go 中使用「reflect.Value.FieldByName()」存取結構體指標中的欄位?

如何在 Go 中使用「reflect.Value.FieldByName()」存取結構體指標中的欄位?

Mary-Kate Olsen
發布: 2024-11-08 11:49:02
原創
235 人瀏覽過

How to Access Fields in a Struct Pointer using `reflect.Value.FieldByName()` in Go?

在指標值上呼叫`reflect.Value.FieldByName()

在Go 中,當使用帶有結構體指針的反射時,嘗試呼叫Reflect結構體指標值上的.Value.FieldByName() 可能會導致以下錯誤:

reflect: call of reflect.Value.FieldByName on ptr Value
登入後複製

問題
當您嘗試存取結構體的欄位時會發生此錯誤表示為指標的值。考慮以下範例:

type Family struct {
  first string
  last string
}
type Person struct {
  name string
  family *Family // Pointer to Family struct
}

func Check(data interface{}) {
  v := reflect.ValueOf(data)
  if v.Kind() == reflect.Struct {
    v = v.FieldByName("family").FieldByName("last")
  }
}
登入後複製

執行此程式碼時,會發生錯誤,因為 family 欄位是指標。

解決方案
解決此問題問題,您需要使用Reflect.Indirect() 取消引用指標值,以在存取欄位之前取得實際的結構值:

v = reflect.Indirect(v.FieldByName("family")).FieldByName("last")
登入後複製

透過此修改,程式碼將正確存取Family 的最後一個欄位struct,無論family 是值還是指標。

說明
reflect.Indirect() 傳回指標指向的值。因此,在這種情況下,它會傳回 Family 結構體值,然後可以透過 FieldByName() 存取該值。

以上是如何在 Go 中使用「reflect.Value.FieldByName()」存取結構體指標中的欄位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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