Golang Go语言中反射真实使用场景
看了 go 反射相关的知识点,看的云里雾里,看完也不知道什么时候要用。想问问大家在真实项目中,有哪些用到反射的场景。
Golang Go语言中反射真实使用场景
可以看下 7-days rpc,实现框架类的东西就会用到反射。动态获取结构体的参数,属性,就不用每增加一个方法就去改一下代码了。
https://geektutu.com/post/geerpc.html
还有一个例子,搞用户资料的时候,一个 userinfo 结构体有几十个字段。update 的时候,之前人写的都是
swicth updateKey{
case “name”:
doUpdateName()
case “gender”:
doUpdateGender()
}
用上反射之后,可以直接获取到结构体的 tag ,每个 tag 绑定一个 update 函数,之前 switch 写了几十上百行,用上反射之后核心逻辑十来行就搞定
- elastic 将 json.RawMeassage 转化为自定义 struct ,参考 https://github.com/olivere/elastic seachResult.Each
2. 自定义一些 tag 解析,如gorm:"col_name" my_tag:"col_name"
,参考 https://gist.github.com/sosedoff/b373623a9572cf1a992486d2d87dcd85
使用反射来实现一个通用的 RPC 框架
使用反射来实现一个 ORM 库
使用反射来生成一个用于测试 API 的测试框架
使用反射来实现一个自定义的日志记录系统
这个不同语言都有啊。go 里最典型的例子就是动态调用 GRPC 和 GORM 的 tag 。
我看一般用在 json/yaml 等格式的编解码上
打印 struct 内的所有内容?
我们用来通过请求名路由导不同的方法处理业务
标准库的 json 处理 tag
select 一个 channel slice
找了我的一段代码,写得不好,见笑了 https://gist.github.com/LindsayZhou/b0c41ec3155952ca2f0b556035f4cfb0
作用是对 示例属性 (json) 的 格式验证,过滤和分割
自己写库,比如根据 struct 的 tag 来执行特定功能
你可以看看游戏服务器,基本都是用了反射,比如 nano,cherry 啥的
- fmt.Printf("%#v", v)这个 log 打印用到
2. json marshal/unmarshal 用到
3. 我们自己写的 sql query result -> protobuf msg 用到
多写,有需求的时候自然就有用了。拿锤子找钉子。。那你可能找到的是木桩
之前写过一段加载配置文件的代码,用了反射。后续的配置文件处理,就可以直接写 struct 就可以了
https://github.com/go-kod/kod/blob/main/registry.go#L129
比如 kod 在做自动依赖注入的时候,就是用的反射 :-)
在Go语言中,反射(reflect)提供了运行时检查和操作任意对象的数据类型和值的能力,其真实使用场景包括但不限于:
- 动态类型判断与转换:当需要处理多种类型的变量且具体类型直到运行时才能确定时,反射可用于检查变量的实际类型,并在可能的情况下进行类型转换。
- 自动生成或处理代码:在编写代码生成工具、ORM(对象关系映射)库时,反射有助于根据结构体字段自动创建数据库表、查询语句等。
- 通用函数或库的实现:例如,编写序列化/反序列化功能、数据验证、通用的配置解析器时,反射可以遍历结构体字段,处理不同类型的值。
- 接口的动态调用:通过reflect.Value的Call方法,可在运行时调用任意函数或方法,这对于实现插件系统、脚本引擎等非常有用。
- 数据解析:在处理JSON或其他格式的数据到Go的数据结构时,反射有助于根据JSON字段名动态设置结构体字段值。
- Web框架中的参数绑定:许多Web框架利用反射来自动将HTTP请求的参数绑定到函数的入参上,无需手动解析每个参数。
使用反射时需谨慎,因为它增加了程序的复杂性和运行时开销。只有在确实需要动态类型操作的场景下才推荐使用。