本文主要是介绍Goalng 反射,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在学习Golang的反射时确实碰到了一些问题
定义了一个学生结构体
type Student struct {name string `json:"student_name"`age int `json:"student_age"`
}
- 首先,在之前学习Java时,反射可以暴力获取类的私有变量和方法,但是在Golang好像不是这样的
问题的首次发现是在通过反射获取方法并调用时,代码如下
func callFuncByReflect(stu *Student){val := reflect.ValueOf(stu)fmt.Println(val.NumMethod())val.Method(0).Call(nil)
}
这是要调用的方法
func (stu *Student) print(){fmt.Println("hello")
}
但是发现,私有方法并不可以调用,并且NumMethod的数量也是0,这时候就很奇怪为什么结构体的私有变量可以获取,而私有方法获取不到。
后来,在通过反射改变结构体中变量的值时就出现了问题
方法如下
func modifyStructByReflect(stu *Student,modKey string,modVal string){val := reflect.ValueOf(stu)val.Elem().FieldByName(modKey).SetString(modVal)}
程序报出了panic:reflect.Value.SetString using value obtained using unexported field
结构体Student中name是未导出字段,也就是私有字段,是不可以修改的
并且,如果要通过反射修改变量的值,就必须通过指针来修改,如果传入的是一个Student结构体的副本,就无法进行修改
原因就在于如果要修改,也是修改这个函数中stu(源Student变量的副本)中的值,并不会对原变量起作用,go的api中也有
相应的可修改的函数reflect.value.CanSet()
总结:
go中发射是无法操作私有变量和方法的,私有变量可以获取其值和字段名称但无法修改,私有方法则是没有办法获取到的,也无
法调用。
另外通过指针Value才能修改字段的值。
这篇关于Goalng 反射的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!