Go语言通过反射用字符串字段给结构体变量赋值理解reflect的使用

更新时间:2023-07-25 12:54:52 阅读: 评论:0

Go语⾔通过反射⽤字符串字段给结构体变量赋值理解reflect的使⽤
Go语⾔通过反射⽤字符串字段给结构体变量赋值理解reflect的使⽤有机和无机
考教师资格证需要考什么科目我们知道给⼀个结构体变量直接赋值可以直接写死
a :=struct{
name string
age int
}{
name:"haha",
age:1,
}
a.name ="hahaha"
**但是如果我们需要⽤⼀个字符串字段给结构体变量赋值,因为字符串有可能是动态传⼊或者动态获取的,所以就需要⽤到反射赋值 **
窗边的小豆豆思维导图直接上代码
需要注意的是
反射不能设置未被导出的字段,所以上⾯的字段都是⼤写
因为要设置内部的值,所以传⼊ValueOf内部的必须是a的地址值潜形
对反射的理解
使⽤场景
反射的作⽤式在运⾏时,动态获取操作结构体变量,数组内部的值,也就是说当要操作外部传进来的不确定属性的结构体,或者不去确定要操作结构体或数组的那些元素的时候,我们才⽤反射.
使⽤反射
反射最外层只有两个⽅法
TypeOf()获取变量的Type(),动态类型也就是外部表象动态类型,
ValueOf()获取变量的Value(),也就是值
… 其他⼀些后⾯可以链式调⽤的⽅法直接看⽂档,⽐较重要的式Kind()获取底层类型也就是基本类型,Elem()将反射的地址转成真实的值,或者获取⼦元素的类型
这⾥着重讲⼀下Elem的注意点
官⽅⽂档中写道西安周边自驾游
// 返回内部⼦元素类型,只能由类型 Array, Chan, Map, Ptr, or Slice 调⽤
Elem() Type
所以我们可以理解当使⽤reflect.Typeof(a).Elem()时,a只能放地址值,或组数组,Map,Slice⼀类的变量,如果我们的a是结构体的真值会panic
a :=struct{
Name string
烤箱如何烤鸡翅
Age int
}{
Name:"haha",
Age:1,
}
reflect.Typeof(a).Elem()//发⽣panic 因为reflect.Typeof(a)是struct
reflect.Typeof(&a).Elem()//正确因为reflect.Typeof(a)是ptr(地址类型) Elem获得的是⼀个结构体类型
还有⼀个很重要的点是,当传⼊reflect.Typeof(a).Elem()的a是⼀个数组,Slice或者Map时,获取到的是⼦元素的类型,reflect.Typeof(&a).Elem()获取的是a的类型
养虾>永不放弃电影a := [4]int{1,1,1,1}
fmt.Print(reflect.TypeOf(&a).Elem(),reflect.TypeOf(a).Elem())
//输出  [4]int int
当使⽤reflect.Valueof(&a).Elem()是传⼊的必须是地址值,要不然会直接Panic
a :=[4]int{1,1,1,1}
fmt.Print(reflect.ValueOf(a).Elem())
//Panic 必须传⼊地址值
只有使⽤了Elem()获取地址值的真实值才能对原始值进⾏修改操作

本文发布于:2023-07-25 12:54:52,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1096038.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:结构   类型   变量   赋值   字符串   反射
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图