返回顶部
首页 > 资讯 > 后端开发 > GO >Golang reflect反射如何使用
  • 658
分享到

Golang reflect反射如何使用

2023-07-06 04:07:07 658人浏览 泡泡鱼
摘要

这篇文章主要介绍“golang reflect反射如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Golang reflect反射如何使用”文章能帮助大家解决问题。首先有一

这篇文章主要介绍“golang reflect反射如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Golang reflect反射如何使用”文章能帮助大家解决问题。

    首先有一段以下结构体的定义

    type User struct {UserName stringUserId   int `name:"uid"`}

    初始化一个结构体的实例

    u := User{"octoboy", 101}

    获取字段名

    首先获取变量的Type变量

    t := reflect.TypeOf(u)

    需要注意的是,如果传入的u是个指针,比如&User{"octoboy", 101}

    if t.Kind() == reflect.Ptr {t = t.Elem()}

    这里通过Kind()函数获取变量的类型,判断如果类型为指针 需要使用Elem()获取指针指向的内容。

    然后遍历结构体的字段,获取其字段名称

    for i := 0; i < t.NumField(); i++ {fmt.Println(t.Field(i).Name)}

    输出结果:

    UserName

    UserId

    获取字段类型和值

    v := reflect.ValueOf(u)if v.Kind() == reflect.Ptr { //类型为指针 需要取elemv = v.Elem()}

    获取字段的值或者赋值,需要用到ValueOf方法

    for i := 0; i < v.NumField(); i++ {//v.Field(i).Int() v.Field(i).String() 都可以把值返回出来,相当于断言 类型不匹配会直接panic//直接断成interface 任意类型fmt.Println(v.Field(i).Interface())}

    输出结果:

    zyg

    101

    继续输出成员变量的类型

    for i := 0; i < v.NumField(); i++ {fmt.Println(v.Field(i).Kind())}

    输出结果:

    string

    int

    设置字段值

    静态赋值

    //设置字段值va := reflect.ValueOf(&u) //这里必须使用指针 否则后面调用Set无法使用无地址的值if va.Kind() == reflect.Ptr { //类型为指针 需要取elem 意为取它指向的内容值va = va.Elem()for i := 0; i < va.NumField(); i++ {//两种方法取设置字段的值,第二种更为统一if va.Field(i).Kind() == reflect.String {//重要 如果需要使用set取修改u中的值,需要在ValueOf中传入u的地址。否则会因为SetString使用了一个不能被寻址的值而造成panicva.Field(i).SetString("octoboy")}if va.Field(i).Kind() == reflect.Int {va.Field(i).Set(reflect.ValueOf(123))}}

    interface切片映射成结构体(动态赋值)

    //练手values := []interface{}{"octoboy", 123}for i := 0; i < va.NumField(); i++ {if reflect.ValueOf(values[i]).Kind() == va.Field(i).Kind() {va.Field(i).Set(reflect.ValueOf(values[i]))}}

    打印以上两种结构题变量

    输出结果:

    &{octoboy 123}

    进阶&mdash;map映射成结构体

    有如下代码

    //练习 把map映射成structset := map[string]interface{}{"UserName": "zyg","UserId":   101,"Age":      19,"Sex":      1,}user := &User{}MapToStruct(set, user)fmt.Println(user)

    要求将map映射到user结构题中,即如果User的字段名如存在于map的key中,则将对应的value值赋给user结构题的成员变量

    有如下实现

    //str类型为interface{} 代表可以传入任意的结构体func MapToStruct(m map[string]interface{}, str interface{}) {val := reflect.ValueOf(str)if val.Kind() != reflect.Ptr {//必须是指针 否则无法用Set赋值panic(any("must be ptr!"))}val = val.Elem()if val.Kind() != reflect.Struct { //指针指向的必须是结构体panic(any("must be struct"))}for i := 0; i < val.NumField(); i++ {name := val.Type().Field(i).Name //value转type后取字段名称if v, ok := m[name]; ok {        //如果根据tag做映射,就使用val.Type().Field(i).Tag.Get("name")作为keyif reflect.ValueOf(v).Kind() == val.Field(i).Kind() {val.Field(i).Set(reflect.ValueOf(v))}}}}

    关于“Golang reflect反射如何使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网GO频道,小编每天都会为大家更新不同的知识点。

    您可能感兴趣的文档:

    --结束END--

    本文标题: Golang reflect反射如何使用

    本文链接: https://lsjlt.com/news/357620.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • Golang reflect反射如何使用
      这篇文章主要介绍“Golang reflect反射如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Golang reflect反射如何使用”文章能帮助大家解决问题。首先有一...
      99+
      2023-07-06
    • Golang reflect反射的使用实例
      目录获取字段名获取字段类型和值设置字段值静态赋值interface切片映射成结构体(动态赋值)进阶—map映射成结构体总结首先有一段以下结构体的定义 type User ...
      99+
      2023-05-15
      Golang reflect反射 Golang reflect
    • golang 如何用反射reflect操作结构体
      背景 需要遍历结构体的所有field 对于exported的field, 动态set这个field的value 对于unexported的field, 通过强行取址的方法来获取该值(...
      99+
      2024-04-02
    • 深入了解Golang中reflect反射的使用
      目录1. 介绍2. 方法示例2.1 通过反射获取对象的键(类型)和值2.2 反射对象的类型和属性3. 反射对Json的操作3.1 反射与Json属性解析3.2 Json包的序列化与反...
      99+
      2023-05-20
      Golang reflect反射 Go reflect反射 Golang reflect
    • 怎么分析Golang的反射reflect
      本篇文章为大家展示了怎么分析Golang的反射reflect,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。编程语言中反射的概念在计算机科学领域,反射是指一类应用,它们能够自描述和自控制。也就是说,这...
      99+
      2023-06-29
    • Golang反射模块reflect使用方式示例详解
      Golang的反射功能,在很多场景都会用到,最基础的莫过于rpc、orm跟json的编解码,更复杂的可能会到做另外一门语言的虚拟机。通过反射模块,我们可以在编程语言的runtime运...
      99+
      2023-01-04
      Golang反射模块reflect 反射reflect
    • golang怎么用反射reflect操作结构体
      这篇文章给大家分享的是有关golang怎么用反射reflect操作结构体的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。golang的优点golang是一种编译语言,可以将代码编译为机器代码,编译后的二进制文件可以...
      99+
      2023-06-14
    • 深入理解Golang的反射reflect示例
      目录编程语言中反射的概念interface 和 反射Golang的反射reflectreflect的基本功能TypeOf和ValueOf说明从relfect.Value中获取接口in...
      99+
      2024-04-02
    • 深入了解Golang中reflect反射基本原理
      目录反射概述反射基础 - go 的 interface 是怎么存储的反射对象 - reflect.Type 和 reflect.Value反射定律Elem 方法reflect.Val...
      99+
      2023-01-04
      Golang reflect反射原理 Golang reflect反射 Golang reflect
    • golang 如何使用反射创建新类型
      利用反射,go 允许创建新类型,1. 使用 reflect.typeof() 获取现有类型的 reflect.type 值;2. 使用 reflect.new() 创建新类型的指针值;3...
      99+
      2024-05-01
      反射 创建类型 golang
    • 一文带你了解Golang中reflect反射的常见错误
      目录获取 Value 的值之前没有判断类型没有传递指针给 reflect.ValueOf在一个无效的 Value 上操作什么时候 IsValid 返回 false其他情况下 IsVa...
      99+
      2023-01-05
      Golang reflect反射错误 Golang reflect反射 Golang reflect
    • C#反射如何使用
      这篇文章主要讲解了“C#反射如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#反射如何使用”吧!explicit 和 implicit 的含义?explicit 和 implicit...
      99+
      2023-06-18
    • Java反射如何使用
      这篇文章将为大家详细讲解有关Java反射如何使用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。反射相信刚接触Java的,第一句肯定会问什么是反射呢?反射有什么作用呢?为什么使用反射呢?首先反射是Java的...
      99+
      2023-06-25
    • 怎么使用Python reflect单例模式反射各个函数
      这篇文章主要介绍“怎么使用Python reflect单例模式反射各个函数”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用Python reflect单例模式反射各个函数”...
      99+
      2023-06-30
    • Go如何利用反射reflect实现获取接口变量信息
      本篇内容主要讲解“Go如何利用反射reflect实现获取接口变量信息”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Go如何利用反射reflect实现获取接口变量信息”吧!引言反射是通过实体对象获...
      99+
      2023-06-30
    • Golang反射机制怎么使用
      本文小编为大家详细介绍“Golang反射机制怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Golang反射机制怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。介绍反射的本质就是在程序运行的时候,获...
      99+
      2023-06-30
    • golang 如何使用反射动态修改变量值
      go 语言反射允许在运行时操控变量值,包括修改布尔值、整数、浮点数和字符串。通过获取变量的 value,可以调用 setbool、setint、setfloat 和 setstring ...
      99+
      2024-05-02
      反射 动态修改变量值 golang 字符串解析
    • PHP中的反射机制以及如何使用反射
      在 PHP 中,反射(Reflection)是一种机制,用于在运行时动态地获取类、接口、函数、方法等的信息。反射机制允许我们在运行时分析和修改代码结构,包括类的属性和方法等。 下面是一个简单的示例,展...
      99+
      2023-10-18
      php 开发语言 后端
    • golang 如何使用反射实现动态代理模式
      go中使用反射实现动态代理答案: 是的,可以通过反射在go中实现动态代理模式。步骤:创建自定义代理类型,包含目标对象引用和方法处理逻辑。为代理类型创建代理方法,在调用目标方法前或后执行额...
      99+
      2024-05-01
      golang 反射 动态代理
    • 【javaSE】 反射与反射的使用
      文章目录 🌲反射的定义🎍反射的用途🌴反射基本信息🍀反射相关的类🚩Class类(反射机制的起源 )🎈...
      99+
      2023-09-16
      开发语言 java 反射
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作