我是靠谱客的博主 执着小蝴蝶,这篇文章主要介绍Go专家编程 反射,现在分享给大家,希望可以做个参考。

interface类型是有一个type和value的概念的,反射就是获取type和value的手段。go恰恰提供了这个功能。

反射三定律:

1:可以将interface变量转换成反射对象。

复制代码
1
2
3
4
5
6
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对象

复制代码
1
2
3
4
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必须是可设置的

复制代码
1
2
3
4
var x float64 = 3.4 v := reflect.ValueOf(&x) v.Elem().SetFloat(7.1) fmt.Println("x :", v.Elem().Interface())

不能通过下边这种方式。

复制代码
1
2
3
4
5
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专家编程内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部