栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Go的反射

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Go的反射

文章目录
  • 前言
  • 一、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 int
1.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修改值
1.4 获取底层类型
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;i 

2.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 23
2.3.2 遍历结构体字段的Tag
pi :=reflect.TypeOf(P)
for i:=0;i
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/309828.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号