新手问题 关于反射的导致panic的一段代码,求解答

littlebeast0 · 2019年07月03日 · 最后由 ioco 回复于 2019年07月03日 · 270 次阅读
package main

import (
    "fmt"
    "reflect"
)

type Student struct {
    age int
    name string
}

func (s *Student)add(age int) {
    s.age += age;
}

func main() {

    s := &Student{20, "jack"}
    elem := reflect.ValueOf(s).Elem()
    stype := elem.Type()

    for i:=0;i<elem.NumField();i++ {
        field := elem.Field(i)
        fmt.Printf("%s,%s,%v\n", field.Type(), stype.Field(i).Name, field.Interface())    
    }
}

期望能正常输出,但是 panic 了。我看了网上的例子写的,基本算是抄的代码了,一直在 field.Interface() 那里 panic,但是一直想不明白为啥会 panic 各位大婶有能帮忙解答一下吗

更多原创文章干货分享,请关注公众号
  • 加微信实战群请加微信(注明:实战群):gocnio

两个办法:

  1. age -> Age, name -> Name
package main

import (
    "fmt"
    "reflect"
)

type Student struct {
    age int
    name string
}

func (s *Student)add(age int) {
    s.age += age;
}

func main() {

    s := &Student{20, "jack"}
    elem := reflect.ValueOf(s).Elem()
    stype := elem.Type()

    for i:=0;i<elem.NumField();i++ {
        field := elem.Field(i)
    switch field.Kind() {
    case reflect.String:
            fmt.Printf("%s,%s,%v\n", field.Type(), stype.Field(i).Name, field.String())
    case reflect.Int:
            fmt.Printf("%s,%s,%v\n", field.Type(), stype.Field(i).Name, field.Int())
    }
    }
}
panic: reflect.Value.Interface: cannot return value obtained from unexported field or method

指明了呀,field.Interface() 试图读取对象的字段值,但结构体字段是不可导出的,改成大写可导出就行了 另外可以通过 field.CanInterface() 判断字段是否可导出。 推荐看你所调用的函数的源码注释

int,Age,20
string,Name,jack
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册