错误翻译理解

不能返回字段或者方法的值

报错代码

定义俩个结构体,People 和 PeopleParent

  1. package main
  2. import (
  3. "fmt"
  4. "reflect"
  5. )
  6. type PeopleParent struct {
  7. kaka string
  8. }
  9. type People struct {
  10. PeopleParent
  11. name string
  12. age int
  13. }

定义方法valueAPI方法

  1. func valueAPI(obj interface{}) {
  2. valueOf := reflect.ValueOf(obj)
  3. // 获取所有属性值
  4. for i := 0; i < valueOf.NumField(); i++ {
  5. value := valueOf.Field(i)
  6. // {}
  7. //咔咔
  8. //24
  9. fmt.Println(value)
  10. }
  11. // 获取父类属性
  12. fieldByIndex := valueOf.FieldByIndex([]int{0, 0})
  13. fmt.Println(fieldByIndex.Interface()) // 咔咔的父类属性
  14. }

main方法调用valueAPI

  1. func main() {
  2. p := People{
  3. PeopleParent: PeopleParent{kaka: "咔咔的父类属性"},
  4. name: "咔咔",
  5. age: 24,
  6. }
  7. typeAPI(p)
  8. valueAPI(p)
  9. }

报错截图

【GO】panic: reflect.Value.Interface: cannot return value obtained from unexported field or method - 图1

问题分析

我们根据学习PHP的经验来分析这个错误,在PHP中一个属性有三种访问方式,私有的,可继承的,公共的。那么在go中,我们有公开的和私有的。但是在go语言的表现方式是属性的大小写和方法的大小写。
这个时候我们应该就可以反映过来了,在上面案例,我们获取的是父类属性的正射,但是报错返回的是不能返回字段或者属性
然后我们回过头在来看一下,发现我们父类的kaka属性确实是小写,那么咱们更改为大写后在编译一次

更改后的源码

  1. package main
  2. import (
  3. "fmt"
  4. "reflect"
  5. )
  6. type PeopleParent struct {
  7. Kaka string
  8. }
  9. type People struct {
  10. PeopleParent
  11. name string
  12. age int
  13. }
  14. func (p *People) eat() {
  15. fmt.Println("咔咔")
  16. }
  17. func main() {
  18. p := People{
  19. PeopleParent: PeopleParent{Kaka: "咔咔的父类属性"},
  20. name: "咔咔",
  21. age: 24,
  22. }
  23. valueAPI(p)
  24. }
  25. func valueAPI(obj interface{}) {
  26. valueOf := reflect.ValueOf(obj)
  27. // 获取所有属性值
  28. for i := 0; i < valueOf.NumField(); i++ {
  29. value := valueOf.Field(i)
  30. // {}
  31. //咔咔
  32. //24
  33. fmt.Println(value)
  34. }
  35. // 获取父类属性
  36. fieldByIndex := valueOf.FieldByIndex([]int{0, 0})
  37. fmt.Println(fieldByIndex.Interface()) // 咔咔的父类属性
  38. }

返回结果

这个时候我们就获取到了父类属性值的正射
【GO】panic: reflect.Value.Interface: cannot return value obtained from unexported field or method - 图2

问题回顾

这个错误的原因是我们对在go中对于结构体的属性访问方式不明确。

博主微信欢迎交流

【GO】panic: reflect.Value.Interface: cannot return value obtained from unexported field or method - 图3