Go专家编程 反射

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会报错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值