Golang 反射

embedded/2024/11/26 22:41:25/

一、Go反射的应用场景

(一)对象序列化和反序列化

  • 场景描述
    • 在处理网络通信,数据存储等场景中,需要将对象转换为字节流(序列化)以便传输或存储,在接收端再将字节流转换回对象(反序列化)。反射可以在不知道对象具体结构的情况下,遍历对象的字段进行序列化和反序列化操作。
  • 优势
    • 灵活性高,能够处理各种不同类型的对象,而不需要为每个类型单独编写序列化和反序列化函数

(二)框架开发

  • 场景描述
    • 例如在Web框架中,需要根据用户定义的路由函数(可能是不同的参数类型和返回值类型)动态地调用对应的处理逻辑。通过反射,可以获取函数的参数信息、返回值类型等,从而在框架内部进行统一的调用和参数传递。
    • 依赖注入框架也经常使用反射,框架可以通过反射来分析需要注入的对象的类型,查找并注入合适的依赖。
  • 优势
    • 实现了高度的通用性,使得框架能够适应不同用户自定义的类型和函数,增强了框架的扩展性。

(三)对象属性的动态修改

  • 场景描述
    • 在某些配置加载的场景中,从配置文件读取的键值对需要动态地赋值给对应地对象属性。反射可以用于查找对象中的属性,并在运行时进行赋值操作。
  • 优势
    • 可以方便地处理大量不同类型地配置对象,而无需为每个类型编写特定地赋值函数

二、Go反射的应用实例

(一)简单的对象序列化

package mainimport ("fmt""reflect"
)type User struct {Name stringAge  int
}func Serialize(obj interface{}) []byte {value := reflect.ValueOf(obj)// 只处理结构体if value.Kind()!= reflect.Struct {return nil}var serialized []bytefor i := 0; i < value.NumField(); i++ {fieldValue := value.Field(i)switch fieldValue.Kind() {case reflect.String:serialized = append(serialized, []byte(fieldValue.String())...)case reflect.Int:serialized = append(serialized, []byte(fmt.Sprintf("%d", fieldValue.Int()))...)}}return serialized
}func main() {user := User{"Alice", 25}serializedData := Serialize(user)fmt.Println(string(serializedData))
}

 在这个例子中,Serialize函数接受一个interface{}类型的对象,通过反射获取对象的类型是结构体后,遍历结构体字段。根据字段类型将字段值转换为字节切片并拼接起来,实现简单的序列化。

(二)动态的函数调用

package mainimport ("fmt""reflect"
)func Add(a, b int) int {return a + b
}func DynamicCall(fn interface{}, args...interface{}) []reflect.Value {f := reflect.ValueOf(fn)in := make([]reflect.Value, len(args))for k, v := range args {in[k] = reflect.ValueOf(v)}return f.Call(in)
}func main() {result := DynamicCall(Add, 3, 5)fmt.Println(result[0].Int())
}

在这个示例中,DynamicCall函数用于动态地调用一个函数。它接受一个函数(以interface{}形式)和函数参数列表。通过反射获取函数的值对象,将参数转换为反射值对象后,使用Call方法来调用函数,并返回函数调用的结果(以[]reflect.Value形式)。这里展示了如何在不知道函数具体类型的情况下,通过反射来调用函数。


http://www.ppmy.cn/embedded/140746.html

相关文章

Linux基础指令(汇总)

文章目录 1. ls指令2. pwd指令3. cd指令4. touch指令5. mkdir指令6. rmdir指令&&rm指令7. man指令8. cp指令8. mv指令9. cat指令10. more指令11. less指令12. head指令13. tail指令14. date指令15. cal指令16. find指令17. which指令18. whereis指令19. alias指令20. g…

【每天学点AI】实战图像增强技术在人工智能图像处理中的应用

图像增强&#xff08;Image Enhancement&#xff09;是人工智能和计算机视觉中一项重要的技术&#xff0c;也是人工智能数据集预处理的一个重要步骤。它旨在提高图像的质量&#xff0c;使其在视觉上更加清晰、细节更丰富。这项技术在自动驾驶、医疗诊断、安防监控等领域有着广泛…

Redis 过期策略和内存淘汰策略

一、过期策略 我们在set key的时候&#xff0c;可以给它设置一个过期时间&#xff0c;比如expire key 60。指定这key60s后过期&#xff0c;60s后&#xff0c;redis是如何处理的&#xff1f; 定时删除&#xff08;Active Expiration&#xff09; 原理&#xff1a;Redis会在后台…

信创改造 - TongRDS 替换 Redis

记得开放 6379 端口哦 1&#xff09;首先在服务器上安装好 TongRDS 2&#xff09;替换 redis 的 host&#xff0c;post&#xff0c;passwd 3&#xff09;TongRDS 兼容 jedis # 例如&#xff1a;更改原先 redis 中对应的 host&#xff0c;post&#xff0c;passwd 改成 TongRDS…

SAP SD学习笔记14 - 返品处理(退货处理)的流程以及系统实操,比如 返品传票;请求Block标记;收到退货之后的处理,请求传票的登录

上一章讲了 出库确认&#xff08;发货&#xff09;之后的取消。 SAP SD学习笔记13 - 出库确认&#xff08;发货&#xff09;之后的取消 - VL09_sap 销售出库取消-CSDN博客 本章继续讲SD模块中返品&#xff08;退货&#xff09;的流程以及系统操作。 比如 - 返品传票&#xf…

第02章_MySQL环境搭建(基础)

1. MySQL 的卸载 1.1 步骤1&#xff1a;停止 MySQL 服务 在卸载之前&#xff0c;先停止 MySQL8.0 的服务。按键盘上的 “Ctrl Alt Delete” 组合键&#xff0c;打开“任务管理器”对话 框&#xff0c;可以在“服务”列表找到“MySQL8.0” 的服务&#xff0c;如果现在“正在…

RNN与LSTM,通过Tensorflow在手写体识别上实战

简介&#xff1a;本文从RNN与LSTM的原理讲起&#xff0c;在手写体识别上进行代码实战。同时列举了优化思路与优化结果&#xff0c;都是基于Tensorflow1.14.0的环境下&#xff0c;希望能给您的神经网络学习带来一定的帮助。如果您觉得我讲的还行&#xff0c;希望可以得到您的点赞…

迈向AI驱动的数据新时代:探索SQL Server 2025的全新向量数据库

随着科技的飞速发展&#xff0c;数据已成为推动各行各业进步的重要动力。而在这个数据爆炸的时代&#xff0c;如何高效地存储、检索和分析数据&#xff0c;成为了摆在我们面前的一大挑战。幸运的是&#xff0c;微软SQL Server 2025的推出&#xff0c;为我们带来了全新的向量数据…