源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

Go语言中反射的正确使用

  • 时间:2021-11-17 09:09 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Go语言中反射的正确使用
[b]介绍[/b] 反射是元数据编程的一种形式,指的是程序获得本身结构的一种能力。不同语言的反射模型实现不一样,本文中的反射,仅仅指的是Go语言中的反射模型。 [b]反射有两个问题,在使用前需要三思:[/b] [list=1] [*]大量的使用反射会损失一定性能[/*] [*]Clear is better than clever. Reflection is never clear. [/*] [/list] [b]Go的类型设计上有一些基本原则,理解这些基本原则会有助于你理解反射的本质:[/b] [list=1] [*]变量包括 <type, value> 两部分。理解这一点你就知道为什么[code]nil != nil[/code]了。 [/*] [*]type包括 [code]static type[/code]和[code]concrete type[/code]. 简单来说 [code]static type[/code]是你在编码是看见的类型,[code]concrete type[/code]是runtime系统看见的类型。 [/*] [*]类型断言能否成功,取决于变量的[code]concrete type[/code],而不是[code]static type[/code]. 因此,一个 reader变量如果它的concrete type也实现了write方法的话,它也可以被类型断言为writer. [/*] [*]Go中的反射依靠[code]interface{}[/code]作为桥梁,因此遵循原则3. 例如,反射包.Kind方法返回的是[code]concrete type[/code], 而不是[code]static type[/code].[/*] [/list] [b]多说无用,下面来看示例代码[/b]
[u]复制代码[/u] 代码如下:
package main   import (     "fmt"     "reflect" )   type T struct {     A int     B string }   func main() {     t := T{23, "skidoo"}     tt := reflect.TypeOf(t)     fmt.Printf("t type:%v\n", tt)     ttp := reflect.TypeOf(&t)     fmt.Printf("t type:%v\n", ttp)     // 要设置t的值,需要传入t的地址,而不是t的拷贝。     // reflect.ValueOf(&t)只是一个地址的值,不是settable, 通过.Elem()解引用获取t本身的reflect.Value     s := reflect.ValueOf(&t).Elem()     typeOfT := s.Type()     for i := 0; i < s.NumField(); i++ {         f := s.Field(i)         fmt.Printf("%d: %s %s = %v\n", i,             typeOfT.Field(i).Name, f.Type(), f.Interface())     } }   // 输出结果 // t type:main.T // t type:*main.T // 0: A int = 23 // 1: B string = skidoo
[b]总结[/b] 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部