m0_59052926 2021-06-06 12:33 采纳率: 100%
浏览 20
已采纳

go语言反射怎样使用结构体

结构体和反射之间怎样转换和使用?转换后怎样访问结构体

  • 写回答

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"))
    }
    

    参考一下详细的使用过程

    如果对你有帮助,可以点击我这个回答右上方的【采纳】按钮,给我个采纳吗,谢谢

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题