golang 中无处不在的反射 reflect

本文探讨了Golang中的反射库reflect,介绍了其在获取变量类型、值、tag等方面的作用,以及在gorm、json、yaml等库中的基础地位。文章详细分析了reflect的源码结构,并讲解了如何通过reflect.ValueOf()和reflect.TypeOf()访问接口变量内容。此外,文中提到了reflect在gin框架中的应用,如gin.Context.Bind()方法,并讨论了反射的性能问题和代码可读性挑战。最后,作者强调理解reflect对于掌握Golang struct和提高程序设计能力的重要性。
摘要由CSDN通过智能技术生成

golang 反射 reflect

reflect 是 golang 的一个标准库, 通过反射可以获取变量的类型、值、tag 等,它是实现 gorm、json、yaml 等库的基础. golang 语言通过反射可以在运行时动态的调用对象的方法和属性.

源码结构

golang reflect 反射的源码位于 golang/go/src/reflect 中,目录下包含以下文件

  • type.go
  • value.go
  • swapper.go
  • deepequal.go
  • makefunc.go
  • all_test.go
  • asm_s390x.s
  • example_test.go
  • set_test.go
  • export_test.go
  • tostring_test.go
  • asm_amd64p32.s
  • asm_mips64x.s
  • asm_386.s
  • asm_arm.s
  • asm_mipsx.s
  • asm_wasm.s
  • asm_amd64.s
  • asm_arm64.s
  • asm_ppc64x.s

在源码中, .s 是一些 golang 汇编文件,核心代码 type.go 3155 行代码, value.go 包含 2774 行代码,swapper.go 及 deepequal.go makefunc.go 总计 309 行代码,剩余 go test 源码 7536 余行.
可以看到 reflect 库的核心源码仅 6000 余行, 对这些代码的理解, 有助于更深刻的理解 golang 的 struct 及一些优秀框架、模块的实现原理.

golang struct

相比与其它语言, golang 的 struct 中可以在类型后增加一段字符串, 即 Tag,在编写程序时,常常通过如下形式对数据进行解析等处理,比如下图所示:

    type jsonStruct struct {
        A int `json:"a,omitempty"`
    }

上面的 struct 中, 变量包含 value、type 及 tag, 其中 tag 内的成员标签变量时 key、value 健值对形式的,参考 StructTag.Lookup(key string) 中获取 tag 中指定 key 的方法

通过 json.Unmarshal 可以将 json 字符串解析到 jsonStruct 类型对象中,同样可以将该类型对象格式化为 json 字符串. 而 json.Unmarshal 及 json.Marshal 都是通过 reflect 实现的.

基础库 reflect

反射是用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值