在本文中,我們將探討在嘗試擷取包含指向的指標的結構體的欄位值時遇到的問題另一個結構體。
考慮這個例子:
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中文網其他相關文章!