本文已参与「新人创作礼」活动,一起开启掘金创作之路 首先,golang反射,分为
- reflect.TypeOf(),反射值的类型等
- reflect.ValueOf(),反射值的内容等
reflect.TypeOf
- 字段数量,因为反射是reflect包中,所以,如果字段首字母小写,不会被计算在内
t:=reflect.TypeOf(n)
num:=t.NumField()
- 查看指定字段的数据
t:=reflect.TypeOf(n)
num:=t.Field(n int)//从0开始,以声明的顺序排序
- 查看方法的数量。注意:首先方法名首字母大写
第二,需要注意声明方法时,方法名是指针还是结构体对象 - 如果是指针类型,则在反射时,也需要传入指针。
type Students struct {
Name string `json:"name"`
Age int
}
func (stu *Students)T(){//第一个方法
fmt.Println(stu.Name)
}
func (stu Students)R(){//第二个方法
fmt.Println(stu.Age)
}
t:=reflect.TypeOf(n)
num:=t.NumMethod()//如果n为指针类型,则只能访问到T()方法
- 如果是值类型
只能访问到R()方法,
t:=reflect.TypeOf(n)
num:=t.NumMethod()
- 访问结构体的json
t:=reflect.TypeOf(n)
t.Field(0).Tag.Get("json")
reflect.ValueOf
- 访问值的内容
t:=reflect.ValueOf(n)
v:=t.Field(0)//访问值的内容
- 更改值的内容,注意,如果需要更改值的内容,需要在反射传参时,传入地址,但也要注意,传入地址后,还需要进行指针指向所在元素。
t:=reflect.ValueOf(n)
t.Elem().Field(0).SetString("~~")//先进行指针指向元素,再确定需要更改的字段,再进行更改值
- 调用函数
t:=reflect.ValueOf(n)
t.Elem().Method(0).Call(nil)//使用call()函数调用方法,如果方法不需要参数,则传nil
也可以通过其他函数,定位到调用的函数
t.Elem().MethodByName("R").Call(nil)//通过函数名,调用方法