结构体和反射之间怎样转换和使用?转换后怎样访问结构体
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"))
}
参考一下详细的使用过程
如果对你有帮助,可以点击我这个回答右上方的【采纳】按钮,给我个采纳吗,谢谢
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632