- 前言
- 一、reflect.ValueOf
- 1.1 取一个变量的值和类型
- 1.2一个变量进行来回转换类型
- 1.3 修改值
- 1.3.1修改一个普通变量
- 1.3.2修改一个结构体
- 1.4 获取底层类型
- 1.5 反射调用方法
- 二、reflect.TypeOf
- 2.1 遍历结构体的字段和方法
- 2.2 是否实现了接口
- 2.3 JSON和结构体互转
- 2.3.1 使用JSON内置的包
- 2.3.2 遍历结构体字段的Tag
前言
提示:以下是本篇文章正文内容,下面案例可供参考
一、reflect.ValueOf 1.1 取一个变量的值和类型i :=3 vi :=reflect.ValueOf(i) ti :=reflect.TypeOf(i) fmt.Println(vi,ti)//3 int1.2一个变量进行来回转换类型
i :=3 vi :=reflect.ValueOf(i)//转换反射类型 fmt.Println(&i,&vi) fmt.Println(i,vi) ti :=vi.Interface().(int) //转换回去, fmt.Println(&vi,&ti) fmt.Println(vi,ti) //虽然值一样,打印的地址是不一样1.3 修改值 1.3.1修改一个普通变量
i :=3 vi :=reflect.ValueOf(&i) vi.Elem().SetInt(4) fmt.Println(i,&vi)1.3.2修改一个结构体
P :=person{
Name: "陈宏迅",
Age: 23,
}
vi :=reflect.ValueOf(&P)
vi.Elem().Field(0).SetString("红杏")
fmt.Println(P)
- 注意一定要传指针类型
- 结构体字段首字母必须大写
- 一定要用Elem()方法获取指针指向的值,这样才能调用Set修改值
P :=person{
Name: "陈宏迅",
Age: 23,
}
vi :=reflect.ValueOf(&P)
fmt.Println(vi.Kind()) //ptr
vi2 :=reflect.ValueOf(P)
fmt.Println(vi2.Kind()) //struct
1.5 反射调用方法
type person struct {
Name string `json:"name"`
Age int `json:"age"`
}
func(p person)Print(s string){
fmt.Printf("%s the person is name is %v,age is %d",s,p.Name,p.Age)
}
func main(){
P :=person{
Name: "陈宏迅",
Age: 23,
}
pi :=reflect.ValueOf(P)
myPrint :=pi.MethodByName("Print") //传入该方法名
agrs :=[]reflect.Value{reflect.ValueOf("登录")}//传入方法的参数
myPrint.Call(agrs)
}
二、reflect.TypeOf
2.1 遍历结构体的字段和方法
pt :=reflect.TypeOf(P) for i:=0;i2.2 是否实现了接口 2.3 JSON和结构体互转 2.3.1 使用JSON内置的包 P :=person{ Name: "陈宏迅", Age: 23, } jsonB,err :=json.Marshal(P) if err == nil { fmt.Println(jsonB)//[123 34 78 97 109 101 34 58 34 233 153 136 229 174 143 232 191 133 34 44 34 65 103 101 34 58 50 51 125] fmt.Println(string(jsonB)) //{"Name":"陈宏迅","Age":23} } respJson := "{"Name":"小李","Age":23}" _ = json.Unmarshal([]byte(respJson),&P) fmt.Println(P) //{小李 23},另外补充:如果结构体有Srting方法,会自动执行该函数,如the person is name is 小李,age is 232.3.2 遍历结构体字段的Tagpi :=reflect.TypeOf(P) for i:=0;i



