在提供的程式碼中,您的資料結構定義的包含一個結構體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")
更新的程式碼
這是正確處理指標值的更新程式碼:
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中文網其他相關文章!