interface

特殊的类型,代表方法的结合,所有的类型都实现了interface{} 的接口,interface其中包含了 (value, type)来存储类型和值。

反射包里有两个接口:

  • reflect.Type
  • reflect.Value

反射三定律:

  1. 将任意类型可转化成反射对象
1
2
3
4
5
6
7
8
9
func main(){
var x float64 = 3.4
// 注意是通过x的类型(type(x))将t转化为reflect.Type类型
t := reflect.TypeOf(x)
fmt.Println("type: ", t)
// 同样
v := reflect.ValueOf(x) //reflect.Value类型
fmt.Println("value: ", v)
}
  1. 将反射对象还原成interface对象
    接着上面的代码

    1
    var y float64 = v.interface().(float64)

    v通过interface()接口转换成interface对象,再通过类型断言转化成之前的类型获取值

  2. 反射对象可修改的前提是value值是可设置的
    如果我们直接用 v.SetFloat(3.14)来试图修改x的值肯定是不对的,刚才提到v实际上由x的值产生,所以无法影响到x本身,golang会对这个无效的更改报错。你可能会像函数传地址那样理所当然的想到ValueOf()传&x即可,但是那样你修改的是 addr 而不是 [addr] 。所以我们得用reflect.Value提供的Elem()方法来获得指针指向的值,之后再对该值进行修改,这样x就会更改了。

    1
    v.Elem().SetFloat(3.14)

这里只是对反射作个基本介绍,还比较基础。有时间去官网博客溜溜~