Golang Go语言中反射真实使用场景

看了 go 反射相关的知识点,看的云里雾里,看完也不知道什么时候要用。想问问大家在真实项目中,有哪些用到反射的场景。


Golang Go语言中反射真实使用场景
19 回复

一般都是写库给别人用的时候用反射吧

更多关于Golang Go语言中反射真实使用场景的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


可以看下 7-days rpc,实现框架类的东西就会用到反射。动态获取结构体的参数,属性,就不用每增加一个方法就去改一下代码了。
https://geektutu.com/post/geerpc.html

还有一个例子,搞用户资料的时候,一个 userinfo 结构体有几十个字段。update 的时候,之前人写的都是
swicth updateKey{
case “name”:
doUpdateName()
case “gender”:
doUpdateGender()
}

用上反射之后,可以直接获取到结构体的 tag ,每个 tag 绑定一个 update 函数,之前 switch 写了几十上百行,用上反射之后核心逻辑十来行就搞定

  1. 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 啥的

  1. 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)提供了运行时检查和操作任意对象的数据类型和值的能力,其真实使用场景包括但不限于:

  1. 动态类型判断与转换:当需要处理多种类型的变量且具体类型直到运行时才能确定时,反射可用于检查变量的实际类型,并在可能的情况下进行类型转换。
  2. 自动生成或处理代码:在编写代码生成工具、ORM(对象关系映射)库时,反射有助于根据结构体字段自动创建数据库表、查询语句等。
  3. 通用函数或库的实现:例如,编写序列化/反序列化功能、数据验证、通用的配置解析器时,反射可以遍历结构体字段,处理不同类型的值。
  4. 接口的动态调用:通过reflect.Value的Call方法,可在运行时调用任意函数或方法,这对于实现插件系统、脚本引擎等非常有用。
  5. 数据解析:在处理JSON或其他格式的数据到Go的数据结构时,反射有助于根据JSON字段名动态设置结构体字段值。
  6. Web框架中的参数绑定:许多Web框架利用反射来自动将HTTP请求的参数绑定到函数的入参上,无需手动解析每个参数。

使用反射时需谨慎,因为它增加了程序的复杂性和运行时开销。只有在确实需要动态类型操作的场景下才推荐使用。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!