Skip to content

Latest commit

 

History

History
38 lines (28 loc) · 1 KB

chapter17.md

File metadata and controls

38 lines (28 loc) · 1 KB

反射

所谓反射就是动态运行时的状态。我们一般用到的包是reflect包

使用reflect一般分成三步:

首先需要把它转化成reflect对象(reflect.Type或者reflect.Value,根据不同的情况调用不同的函数)

t := reflect.TypeOf(i) //得到类型的元数据,通过t我们能获取类型定义里面的所有元素
v := reflect.ValueOf(i) //得到实际的值,通过v我们获取存储在里面的值,还可以去改变值

获取反射值能返回相应的类型和数值

var x float64 = 3.4
v := reflect.ValueOf(x)
fmt.Println("type:", v.Type())
fmt.Println("kind is float64:", v.Kind() == reflect.Float64)
fmt.Println("value:", v.Float())

如果是struct的话,可以使用Elem()

tag := t.Elem().Field(0).Tag //获取定义在struct里面的Tag属性
name := v.Elem().Field(0).String() //获取存储在第一个字段里面的值

修改

var x float64 = 3.4
p := reflect.ValueOf(&x)
v := p.Elem()//必须的步骤
v.SetFloat(7.1)