go-reflection

反射是指程序能够查看自己的结构的能力,通常是通过类型来实现的。

官网laws of reflection

Types and interface

反射是建立在类型系统之上的。 go是静态类型,所有变量都有一个类型,在编译阶段就确定了。

type MyInt int

var i int
var j MyInt

i 类型为int, j类型为MyInt,虽然底层实现i和j都是int,但是不通过转换不能相互赋值。

一个重要的类型是接口interface,表现为一组固定的方法。一个接口可以保持任何实现了接口方法的具体值(除了接口)。

一个接口变量保存的是一对值(value, type)。

反射从接口值到反射对象

简单地说,反射就是检测保存接口里面的类型和值的一种机制。
反射包有Type和Value.

import (
"fmt"
"reflect"
)

func main() {
var x float64 = 3.4
fmt.Println("type:", reflect.TypeOf(x))
}
// TypeOf returns the reflection Type of the value in the interface{}.
func TypeOf(i interface{}) Type

先把x赋值给空接口,

从反射对象到接口值

修改反射对象,它的的值必须是可设置的

可设置是反射值的一个属性,不是所有的反射值都有这个属性。

var x float64 = 3.4
v := reflect.ValueOf(x)
fmt.Println("settability of v:", v.CanSet())

prints
settability of v: false