在指標值上呼叫`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中文網其他相關文章!