golang的反射机制

76 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路 首先,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)//通过函数名,调用方法