欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

使用Go语言中反射的方法技巧

来源:本站整理 作者:佚名 时间:2016-12-14 TAG: 我要投稿

介绍
反射是元数据编程的一种形式,指的是程序获得本身结构的一种能力。不同语言的反射模型实现不一样,本文中的反射,仅仅指的是Go语言中的反射模型。
反射有两个问题,在使用前需要三思:
大量的使用反射会损失一定性能
Clear is better than clever. Reflection is never clear.
Go的类型设计上有一些基本原则,理解这些基本原则会有助于你理解反射的本质:
变量包括 <type, value> 两部分。理解这一点你就知道为什么nil != nil了。
type包括 static type和concrete type. 简单来说 static type是你在编码是看见的类型,concrete type是runtime系统看见的类型。
类型断言能否成功,取决于变量的concrete type,而不是static type. 因此,一个 reader变量如果它的concrete type也实现了write方法的话,它也可以被类型断言为writer.
Go中的反射依靠interface{}作为桥梁,因此遵循原则3. 例如,反射包.Kind方法返回的是concrete type, 而不是static type.
多说无用,下面来看示例代码
 
复制代码 代码如下:
 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
 
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载