结构体和反射之间怎样转换和使用?转换后怎样访问结构体
2条回答 默认 最新
- CSDN专家-黄老师 2021-06-06 12:34关注
package main import ( "fmt" "reflect" "strings" ) // 定义结构体 type cat struct { Name string Age int `json:"age" id:"101"` } // 定义结构体方法 func (c *cat) speak(){ fmt.Printf("喵喵喵") } // 定义函数 func GetFieldByIndex(a string) bool { return strings.ToLower(a) == "name" } func main() { // 创建结构体变量 c := cat{Name: "Lily", Age: 18} // ValueOf()创建反射结构体变量 vc := reflect.ValueOf(c) // 计算成员数量 vnu := vc.NumField() fmt.Printf("NumField()计算成员数量:%v,数据类型:%T\n", vnu, vnu) // 以成员名称访问成员值 vn := vc.FieldByName("Name") fmt.Printf("FieldByName()访问某个成员:%v,数据类型:%T\n", vn, vn) // 以成员排序索引访问成员值 vi := vc.Field(1) fmt.Printf("Field()访问某个成员:%v,数据类型:%T\n", vi, vi) // 以成员排序索引访问成员值,索引值以切片表示 vbi := vc.FieldByIndex([]int{0}) fmt.Printf("FieldByIndex()访问某个成员:%v,数据类型:%T\n", vbi, vbi) // 以函数方式判断并获取某个成员名称,再从成员名称获取成员值 vf := vc.FieldByNameFunc(GetFieldByIndex) fmt.Printf("FieldByNameFunc()访问某个成员:%v,数据类型:%T\n", vf, vf) // 判断反射结构体变量能否修改数据 fmt.Printf("反射结构体变量能否修改数据:%v\n", vc.CanSet()) // ValueOf()创建反射结构体指针变量 vc_pit := reflect.ValueOf(&c) // 获取所有成员的值 ve := vc_pit.Elem() fmt.Printf("Elem()获取所有成员的值:%v,数据类型:%T\n", ve, ve) // Set()、SetInt()等方法设置成员值 ve.FieldByName("Name").SetString("Tom") ve.FieldByName("Name").Set(reflect.ValueOf("Tim")) ve.FieldByName("Age").SetInt(666) fmt.Printf("Set()、SetInt()等方法设置成员值:%v\n", ve) // TypeOf()创建反射结构体变量 vt := reflect.TypeOf(c) // 遍历结构体所有成员数量 for i := 0; i < vt.NumField(); i++ { // 获取每个成员的结构体成员类型 vinfo := vt.Field(i) // 输出成员名和tag fmt.Printf("结构成员:%v,其标签为:%v\n", vinfo.Name, vinfo.Tag) } // 通过成员名, 找到成员类型信息 if catTypeName, ok := vt.FieldByName("age"); ok { // 从tag中取出需要的tag fmt.Printf("标签json的内容:%v\n", catTypeName.Tag.Get("json")) fmt.Printf("标签id的内容:%v\n", catTypeName.Tag.Get("id")) } // 通过成员索引, 找到成员类型信息,索引以切片形式表示 catTypeIndex := vt.FieldByIndex([]int{1}) fmt.Printf("标签json的内容:%v\n", catTypeIndex.Tag.Get("json")) fmt.Printf("标签id的内容:%v\n", catTypeIndex.Tag.Get("id")) // 通过成员索引, 找到成员类型信息,索引以切片形式表示 catTypeField := vt.Field(1) fmt.Printf("标签json的内容:%v\n", catTypeField.Tag.Get("json")) fmt.Printf("标签id的内容:%v\n", catTypeField.Tag.Get("id")) }
参考一下详细的使用过程
如果对你有帮助,可以点击我这个回答右上方的【采纳】按钮,给我个采纳吗,谢谢
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 机器人轨迹规划相关问题
- ¥15 word样式右侧翻页键消失
- ¥15 springboot+vue 集成keycloak sso到阿里云
- ¥15 win7系统进入桌面过一秒后突然黑屏
- ¥30 backtrader对于期货交易的现金和资产计算的问题
- ¥15 求C# .net4.8小报表工具
- ¥15 安装虚拟机时出现问题
- ¥15 Selenium+docker Chrome不能运行
- ¥15 mac电脑,安装charles后无法正常抓包
- ¥18 visio打开文件一直显示文件未找到