iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >Golang reflect反射的使用实例
  • 137
分享到

Golang reflect反射的使用实例

Golang reflect反射Golang reflect 2023-05-15 20:05:13 137人浏览 八月长安
摘要

目录获取字段名获取字段类型和值设置字段值静态赋值interface切片映射成结构体(动态赋值)进阶—map映射成结构体总结首先有一段以下结构体的定义 type User

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

type User struct {
	UserName string
	UserId   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 { //类型为指针 需要取elem
	v = 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使用了一个不能被寻址的值而造成panic
			va.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}

进阶—map映射成结构体

有如下代码

	//练习 把map映射成struct
	set := 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")作为key
			if reflect.ValueOf(v).Kind() == val.Field(i).Kind() {
				val.Field(i).Set(reflect.ValueOf(v))
			}
		}
	}
}

总结

1.TypeOf 用Name 获取字段名,也可以用Kind获取字段的类型;ValueOf 只能用Kind获取字段的类型。

2.使用reflect.ValueOf(u).Type()转成type,可以与reflect.TypeOf(u)达到一样的效果

3.如果要使用Set,SetString等方法为其赋值,reflect.ValueOf(u)这里的u必须传入一个指针,否则无法寻址,会出现panic

4.reflect.ValueOf(u).Interface()可以获取值,在实际使用过程中往往会将返回结果断言成一个接口类型去调用接口函数

到此这篇关于golang reflect反射的使用实例的文章就介绍到这了,更多相关Go reflect反射内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: Golang reflect反射的使用实例

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Golang reflect反射的使用实例
    目录获取字段名获取字段类型和值设置字段值静态赋值interface切片映射成结构体(动态赋值)进阶—map映射成结构体总结首先有一段以下结构体的定义 type User ...
    99+
    2023-05-15
    Golang reflect反射 Golang reflect
  • Golang reflect反射如何使用
    这篇文章主要介绍“Golang reflect反射如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Golang reflect反射如何使用”文章能帮助大家解决问题。首先有一...
    99+
    2023-07-06
  • 深入理解Golang的反射reflect示例
    目录编程语言中反射的概念interface 和 反射Golang的反射reflectreflect的基本功能TypeOf和ValueOf说明从relfect.Value中获取接口in...
    99+
    2024-04-02
  • Golang反射模块reflect使用方式示例详解
    Golang的反射功能,在很多场景都会用到,最基础的莫过于rpc、orm跟json的编解码,更复杂的可能会到做另外一门语言的虚拟机。通过反射模块,我们可以在编程语言的runtime运...
    99+
    2023-01-04
    Golang反射模块reflect 反射reflect
  • 深入了解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操作结构体
    背景 需要遍历结构体的所有field 对于exported的field, 动态set这个field的value 对于unexported的field, 通过强行取址的方法来获取该值(...
    99+
    2024-04-02
  • golang怎么用反射reflect操作结构体
    这篇文章给大家分享的是有关golang怎么用反射reflect操作结构体的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。golang的优点golang是一种编译语言,可以将代码编译为机器代码,编译后的二进制文件可以...
    99+
    2023-06-14
  • 怎么使用Python reflect单例模式反射各个函数
    这篇文章主要介绍“怎么使用Python reflect单例模式反射各个函数”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用Python reflect单例模式反射各个函数”...
    99+
    2023-06-30
  • Python reflect单例模式反射各个函数
    目录reflect反射实例分析getattr()函数的使用方法setattr() 函数对应函数 getattr()delattr 函数用于删除属性单例模式应用场景reflect反射 ...
    99+
    2024-04-02
  • Golang 中反射的应用实例详解
    目录引言Golang类型设计原则Golang 中为什么要使用反射/什么场景可以(应该)使用反射举例场景:反射的基本用法反射的性能分析与优缺点测试反射结构体初始化测试结构体字段读取/赋...
    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
  • reflect Java的反射机制是怎样的
    reflect Java的反射机制是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、类型识别的两种方式:首先了解一下“运行时类型识别”(Run-time Type Id...
    99+
    2023-06-17
  • 一文带你了解Golang中reflect反射的常见错误
    目录获取 Value 的值之前没有判断类型没有传递指针给 reflect.ValueOf在一个无效的 Value 上操作什么时候 IsValid 返回 false其他情况下 IsVa...
    99+
    2023-01-05
    Golang reflect反射错误 Golang reflect反射 Golang reflect
  • JS 中Proxy代理和 Reflect反射方法示例详解
    目录正文1.属性描述符2.Reflect3.Proxy3.1 创建空代理3.2 定义捕获器3.3 捕获器不变式3.4 可撤销代理4.代理捕获器与反射方法4.1 get()4.2 se...
    99+
    2022-11-13
    JS Proxy代理Reflect反射 JS 代理反射
  • 深入理解go reflect反射慢的原因
    目录go 的性能测试go 反射慢的原因go interface{} 带来的灵活性go 灵活性的代价(慢的原因)慢是相对的go 反射性能优化通过代码生成的方式避免序列化和反序列化时的反...
    99+
    2023-01-10
    go reflect反射慢 go reflect反射 go reflect
  • 【javaSE】 反射与反射的使用
    文章目录 🌲反射的定义🎍反射的用途🌴反射基本信息🍀反射相关的类🚩Class类(反射机制的起源 )🎈...
    99+
    2023-09-16
    开发语言 java 反射
  • Golang反射机制怎么使用
    本文小编为大家详细介绍“Golang反射机制怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Golang反射机制怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。介绍反射的本质就是在程序运行的时候,获...
    99+
    2023-06-30
  • golang反射实现工厂
    在Golang中,反射(reflection)是一种机制,用于检查和操作程序元素的运行时特性,包括类型、结构体、变量和方法等。使用反射,开发者可以根据运行时的需求,动态获取和操作程序的各类数据和对象,这在工厂模式的实现中也非常有用。本文将介...
    99+
    2023-05-15
  • golang反射实现原理
    Golang是一种简单、高效、并发安全的编程语言。它的反射机制使得程序员可以在运行时获取和修改程序对象的信息,实现动态编程。本文将介绍Golang反射的实现原理,帮助读者更好地理解反射的工作机制和使用方式。一、反射的基础概念反射是一种程序在...
    99+
    2023-05-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作