Go反射初步
interface
特殊的类型,代表方法的结合,所有的类型都实现了interface{}
的接口,interface其中包含了 (value, type)来存储类型和值。
反射包里有两个接口:
- reflect.Type
- reflect.Value
反射三定律:
- 将任意类型可转化成反射对象
1 | func main(){ |
将反射对象还原成interface对象
接着上面的代码1
var y float64 = v.interface().(float64)
v通过interface()接口转换成interface对象,再通过类型断言转化成之前的类型获取值
反射对象可修改的前提是value值是可设置的
如果我们直接用v.SetFloat(3.14)
来试图修改x的值肯定是不对的,刚才提到v实际上由x的值产生,所以无法影响到x本身,golang会对这个无效的更改报错。你可能会像函数传地址那样理所当然的想到ValueOf()传&x即可,但是那样你修改的是 addr 而不是[addr]
。所以我们得用reflect.Value提供的Elem()
方法来获得指针指向的值,之后再对该值进行修改,这样x就会更改了。1
v.Elem().SetFloat(3.14)
这里只是对反射作个基本介绍,还比较基础。有时间去官网博客溜溜~
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Legendary!