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 关于#MATLAB#的问题,如何解决?(相关搜索:信噪比,系统容量)
  • ¥500 52810做蓝牙接受端
  • ¥15 基于PLC的三轴机械手程序
  • ¥15 多址通信方式的抗噪声性能和系统容量对比
  • ¥15 winform的chart曲线生成时有凸起
  • ¥15 msix packaging tool打包问题
  • ¥15 finalshell节点的搭建代码和那个端口代码教程
  • ¥15 Centos / PETSc / PETGEM
  • ¥15 centos7.9 IPv6端口telnet和端口监控问题
  • ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作