概述
interface类型是有一个type和value的概念的,反射就是获取type和value的手段。go恰恰提供了这个功能。
反射三定律:
1:可以将interface变量转换成反射对象。
var x float64 = 3.4
t := reflect.TypeOf(x) //t is reflect.Type
fmt.Println("type:", t)
v := reflect.ValueOf(x) //v is reflect.Value
fmt.Println("value:", v)
2:可以将反射对象还原成interface对象
var x float64 = 3.4
v := reflect.ValueOf(x) //v is reflect.Value
var y float64 = v.Interface().(float64)
fmt.Println("value:", y)
3:反射对象可修改,value必须是可设置的
var x float64 = 3.4
v := reflect.ValueOf(&x)
v.Elem().SetFloat(7.1)
fmt.Println("x :", v.Elem().Interface())
不能通过下边这种方式。
var x float64 = 3.4
v := reflect.ValueOf(x)
v.SetFloat(7.1) // Error: will panic.
panic: reflect: reflect.Value.SetFloat using unaddressable value
至于原因很容易理解,函数传参是传值,也就是说reflect.ValueOf(x)是把x的值传进去了,而并非x本身,所以通过v修改x是无效的修改,所以golang会报错。
最后
以上就是执着小蝴蝶为你收集整理的Go专家编程 反射的全部内容,希望文章能够帮你解决Go专家编程 反射所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复