go reflect详解

go reflect详解本文主要讲解 reflect 基础和常用方法 下文会讲解常见的应用场景

目录

1.基础使用

2.结构体字段读取

3.方法调用

4.设置值


本文操作对象定义如下

type User struct { Name string Age int Height int } func (u *User) Hello(msg string) { fmt.Printf("My name is %s, age %v, msg:%v\n", u.Name, u.Age, msg) }

1.基础使用

运行中的程序变量都是由类型和值构成的,通过reflect.TypeOf和reflect.ValueOf方法获取运行时的类型和值信息,如下

// 基础使用 func CheckType(o interface{}) { t := reflect.TypeOf(o) switch t.Kind() { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: fmt.Println("Int number") case reflect.Float64, reflect.Float32: fmt.Println("Float number") case reflect.String: fmt.Println("String") case reflect.Slice: fmt.Println("Slice") case reflect.Map: fmt.Println("Map") case reflect.Struct: fmt.Println("Struct") default: fmt.Printf("Unknown %v\n", t) } } func Info(o interface{}) { //反射访问类型和值 t := reflect.TypeOf(o) fmt.Printf("%v\n", t) v := reflect.ValueOf(o) fmt.Printf("%v\n", v) // Kind 具体分类 if k := t.Kind(); k != reflect.Struct { fmt.Println("Bad Input Type") return } // 遍历输出类型和值 for i := 0; i < t.NumField(); i++ { f := t.Field(i) fv := v.Field(i).Interface() fmt.Printf("%6s %v=%v\n", f.Name, f.Type, fv) } } func TestBase(t *testing.T) { u := User{Age: 16, Name: "wenzhou", Height: 18} Info(u) CheckType(u) CheckType(&u) }

输出如下

1.这里通过NumFiield遍历结构体

2.这里的Kind 和 Type的差别在于:前者是常用的golang数据类型定义(int/string/struct等),后者是程序定义的具体文件中的具体类型名称(如reflect_test.User)

2.结构体字段读取

 结构体可以通过FieldByName来访问,也可以通过数组下标访问对应StructField,如下

// 结构的字段反射访问 func Info2(o interface{}) { t2 := reflect.TypeOf(o) v2 := reflect.ValueOf(o) fmt.Printf("%v \n", t2.Field(0)) fmt.Println(v2.FieldByName("Name")) } func TestReflectStructField(t *testing.T) { u := User{Age: 16, Name: "wenzhou", Height: 18} Info2(u) }

 输出

3.方法调用

使用MethodByName 实现方法调用,注意参数以数组形式传入,如下

// 使用value的method调用 func Info4(o interface{}) { v := reflect.ValueOf(o) m := v.MethodByName("Hello") args := []reflect.Value{reflect.ValueOf("testall")} m.Call(args) } func TestReflectCall(t *testing.T) { u := User{Age: 16, Name: "wenzhou", Height: 18} Info4(&u) }

4.设置值

设置值必须传入指针类型,具体的值设置需要通过Elem取得对应值类型才能设置,参考如下

// 设置值必须是pointer interface, 此时用Elem取得指针的值来操作 func Info3(o interface{}) { x := 3 v1 := reflect.ValueOf(&x) //注意ptr v1.Elem().SetInt(100) fmt.Println("x=", x) //完整预判过程 v2 := reflect.ValueOf(o) if k := v2.Kind(); k != reflect.Ptr || !v2.Elem().CanSet() { fmt.Println("bad input") return } //取出指针指向对象值,遍历或者查找名字来设置 v2 = v2.Elem() n := v2.FieldByName("Name") if !n.IsValid() { fmt.Println("No Name field") return } if n.Kind() != reflect.String { fmt.Println("No Name string") return } n.SetString("wenwen") v2.Field(1).SetInt(2) }

本文主要讲解reflect基础和常用方法,下文会讲解常见的应用场景。

原创,转载请注明来自

  • 博客https://blog.csdn.net/wenzhou1219
  • 个人网站http://jimwen.net/
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/218465.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午7:11
下一篇 2026年3月18日 上午7:11


相关推荐

  • pytorch中resnet_通过Pytorch实现ResNet18

    pytorch中resnet_通过Pytorch实现ResNet18对于像我这样刚刚入门深度学习的同学来说,可能接触学习了一个开发工具,却没有通过运用来熟练的掌握它。而ResNet是深度学习里面一个非常重要的backbone,并且ResNet18实现起来又足够简单,所以非常适合拿来练手。我们这里的开发环境是:python3.6.10pytorch1.5.0torchvision0.6.0cudatoolkit10.2.89cudnn7.6.5首先,我们需…

    2022年5月26日
    36
  • 游戏账号与服务器断开连接是怎么回事,王牌战争代号英雄与服务器断开连接是怎么回事 进不去游戏解决办法…

    游戏账号与服务器断开连接是怎么回事,王牌战争代号英雄与服务器断开连接是怎么回事 进不去游戏解决办法…王牌战争代号英雄与服务器断开连接是怎么回事 玩游戏闪退是最让人糟心的事情了王牌战争因为游戏高清细腻的画质 所以会导致部分手机出现闪退和进不去游戏的情况 这个时候怎么办呢 下面小编就告诉大家王牌战争闪退进不去游戏的快速解决方法 王牌战争无法进入游戏原因 1 因为您的手机内存中安装的软件过多 导致的手机内存不够用 您可以使用软件助手搬家功能将手机内存中的软件搬家到 SD 卡 搬家以后就可以很好的预留出手机

    2026年3月18日
    2
  • string substr函数

    string substr函数string 结构有一个成员函数叫 substr 可以用它实现 basic string substrbasic stringsubstr size type Off 0 size type Count npos const 功能 从一个字符串复制一个从指定位置开始 并具有指定长度的子字符串 参数 nbsp Off 所需的子字符串的起始位置 字符串中第一个字符的索引为 0 默认值为 0 C

    2026年1月20日
    2
  • vs2012 express 密钥「建议收藏」

    vs2012 express 密钥「建议收藏」VisualStudioExpress2012forWindowsDesktopKEY:MMVJ9-FKY74-W449Y-RB79G-8GJGJMicrosoftVisualStudioExpress2012forWebKEY:VX3VY-8GCVT-KJQCY-RQ99X-MCF2RVisualStudioExpress

    2025年7月26日
    4
  • 使用AI智能体搭建知识库-RAG语义检索

    使用AI智能体搭建知识库-RAG语义检索

    2026年3月15日
    1
  • datagrip激活码2020 mac_通用破解码

    datagrip激活码2020 mac_通用破解码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月17日
    151

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号