reflect包实现了运行时反射,允许程序操作任意类型的对象。典型用法是用静态类型interface{}保存一个值,通过调用TypeOf获取其动态类型信息,该函数返回一个Type类型值。调用ValueOf函数返回一个Value类型值,该值代表运行时的数据。Zero接受一个Type类型参数并返回一个代表该类型零值的Value类型值

type

package mainimport ("reflect""fmt"
)type lx interface {SayHi()
}type User struct {Name stringAge  int64Sex  string
}func (u *User) SayHi() {fmt.Println("hello world")
}func main() {user := User{"张三", 25, "男"}FillStruct(user)
}func FillStruct(obj interface{}) {t := reflect.TypeOf(obj)       //反射出一个interface{}的类型fmt.Println(t.Name())          //类型名fmt.Println(t.Kind().String()) //Type类型表示的具体分类fmt.Println(t.PkgPath())       //反射对象所在的短包名fmt.Println(t.String())        //包名.类型名fmt.Println(t.Size())          //要保存一个该类型要多少个字节fmt.Println(t.Align())         //返回当从内存中申请一个该类型值时,会对齐的字节数fmt.Println(t.FieldAlign())    //返回当该类型作为结构体的字段时,会对齐的字节数var u Userfmt.Println(t.AssignableTo(reflect.TypeOf(u)))  // 如果该类型的值可以直接赋值给u代表的类型,返回真fmt.Println(t.ConvertibleTo(reflect.TypeOf(u))) // 如该类型的值可以转换为u代表的类型,返回真fmt.Println(t.NumField())             // 返回struct类型的字段数(匿名字段算作一个字段),如非结构体类型将panicfmt.Println(t.Field(0).Name)          // 返回struct类型的第i个字段的类型,如非结构体或者i不在[0, NumField())内将会panicfmt.Println(t.FieldByName("Age"))     // 返回该类型名为name的字段(会查找匿名字段及其子字段),布尔值说明是否找到,如非结构体将panicfmt.Println(t.FieldByIndex([]int{0})) // 返回索引序列指定的嵌套字段的类型,等价于用索引中每个值链式调用本方法,如非结构体将会panic
}

Value

package mainimport ("reflect""fmt"
)type User struct {Name  stringAge   intSex   boolPhone *stringQian  float64Atest uintGroup interface{}Btest interface{}
}func (u *User) Hello() {fmt.Println("hello world 你好世界")
}func main() {a := "hello world 你好世界"user := &User{"张三", 25, true, &a, 88.8, 9, 99, nil}var obj interface{} = userv := reflect.ValueOf(obj)method := v.MethodByName("Hello") //返回v的名为Hello的方法method.Call([]reflect.Value{})    //执行反射的方法fmt.Println(v.IsValid()) //返回v是否持有值,如果v是value零值会返回假,此时v除了IsValid String Kind之外的方法都会导致panicfmt.Println(v.Kind())    //返回v持有值的分类,如果v是value零值,返回值为invalidfmt.Println(v.Type())    //返回v持有值的类型Type表示v = v.Elem() //返回持有的接口的值,或者指针的值,如果不是interface{}或指针会panic,实际上是从 *User到Uservar u Userfmt.Println(v.Convert(reflect.TypeOf(u)).FieldByName("Name")) //转换为其他类型的值,如果无法使用标准Go转换规则来转换,那么panicfmt.Println(v.FieldByName("Name").CanSet())   //是否可以设置Name的值v.FieldByName("Name").SetString("把Name值修改一下") //设置v的持有值,如果v的kind不是string或者v.Canset()返回假,会panicv.FieldByName("Name").Set(reflect.ValueOf(a)) //将v的持有值修改为a的反射值,如果Canset返回假,会panicfmt.Println(v.FieldByName("Group").Elem())     //返回持有的接口的值,或者指针的值,如果不是interface{}或指针会panicfmt.Println(v.FieldByName("Phone").Elem())     //或者指针的值fmt.Println(v.FieldByName("Name").Interface()) //把Name当做interface{}值fmt.Println(v.FieldByName("Name").String()) //返回v持有的值的字符串表示,如果v的值不是string也不会panicfmt.Println(v.FieldByName("Sex").Bool())    //返回持有的布尔值,如果v的kind不是bool会panicfmt.Println(v.FieldByName("Age").Int())     //返回持有的int64,如果v的kind不是int int8-int64会panicvar x int64fmt.Println(v.FieldByName("Age").OverflowInt(x)) //如果v持有值的类型不能无一出的表示x,会返回真,如果v的kind不是int int8-int64会panicfmt.Println(v.FieldByName("Atest").Uint())       //返回v持有的无符号整数,如果v的kind不是uint uintptr uint8 uint16 uint32 uint64会panicvar x2 uint64fmt.Println(v.FieldByName("Atest").OverflowUint(x2)) //如果v持有的值的类型不能无溢出的表示x2,会返回真,如果v的kind不是uint uintptr uint8 uint16 uint32 uint64会panicfmt.Println(v.FieldByName("Qian").Float())           //返回v持有的浮点数float64,如果v的kind不是float32 float64会panicvar x3 float64fmt.Println(v.FieldByName("Qian").OverflowFloat(x3)) //如果v持有值的类型不能无溢出的表示x3,会返回真,如果v的kind不是float32 float64会panicfmt.Println(v.FieldByName("Btest").IsNil())          //如果v持有值是否为nil,如果v的值不是通道 函数 接口 映射 指针 切片之一会panicfmt.Println(v.NumField())             //返回v持有的结构体类型值的字段数,如果v的kind不是struct会panicfmt.Println(v.Field(0))               //返回结构体的第i个字段,如果v的kind不是struct或i出界会panicfmt.Println(v.FieldByIndex([]int{0})) //和上面一样,没明白有啥用}

转载于:https://my.oschina.net/tongjh/blog/513540

golang reflect相关推荐

  1. golang reflect Pointer 获取 传入的interface信息

    使用反射可以获取到数据的类型信息,reflect.TypeOf()返回的数据类型如下: type rtype struct {size uintptrptrdata uintptr // number ...

  2. golang reflect

    go语言中reflect反射机制.详细原文:地址 接口值到反射对象 package mainimport ("fmt""reflect" )func main( ...

  3. golang reflect 反射 简介

    和Java语言一样,Go也实现运行时反射,这为我们提供一种可以在运行时操作任意类型对象的能力.比如我们可以查看一个接口变量的具体类型,看看一个结构体有多少字段,如何修改某个字段的值等等. TypeOf ...

  4. golang Reflect包

    2019独角兽企业重金招聘Python工程师标准>>> Reflect包 Reflect 反射包有2个重要的类型,分别通过Typeof()和ValueOf()返回. 分别在源码包里的 ...

  5. Golang的反射reflect深入理解和示例

    [TOC] Golang的反射reflect深入理解和示例 [记录于2018年2月] 编程语言中反射的概念 在计算机科学领域,反射是指一类应用,它们能够自描述和自控制.也就是说,这类应用通过采用某种机 ...

  6. Go 语言编程 — reflect 反射机制

    目录 文章目录 目录 为什么需要反射? reflect 包 通过 reflect.TypeOf() 获取对象的反射类型 reflect.Type 通过 reflect.Elem() 获取指针所指向的对 ...

  7. golang 函数指针相等比较

    使用反射 reflect.ValueOf(functionName).Pointer()  反射详细参考:<golang reflect 反射 简介>https://blog.csdn.n ...

  8. Golang 任意类型切片的增删改查

    文章目录 1.增加元素 1.1 使用 []interface{} 实现 1.2 使用 interface{} 实现 1.3 使用 interface{} 的优雅实现 2.删除元素 3.修改元素 4.查 ...

  9. 年终盘点!2017年超有价值的Golang文章

    由于微信链接没办法直接点击,所以后面这些链接都是需要大家自己copy打开 马上就要进入2018年了,作为年终的盘点,本文列出了一些2017年的关于Go编程的一些文章,并加上简短的介绍. 文章排名部分先 ...

最新文章

  1. 【转】Visual Studio 2010 架构图之用例图(UML Use Case Diagram)
  2. mvc学习-编辑提交需要注意-mvc重点
  3. grailsgroovy的IllegalArgument异常
  4. hibernate左连接查询时在easyUI的dataGrid中有些行取值为空的解决办法
  5. 花花酱leetcode 题目——搜索专题
  6. 细数开源历史上的十个重大事件
  7. Java 如何抛出异常、自定义异常、手动或主动抛出异常
  8. SparkMapReduce的区别、多线程多进程的区别
  9. Dictionary的遍历和修改
  10. 用u盘刻录装服务器系统盘,光盘系统刻录到U盘上教程
  11. 测试理论学习(分类、流程、方法)
  12. 求教lotka-volterra模型在matlab中的仿真模拟
  13. 团队作业1---团队展示
  14. MongoTemplate 聚合查询
  15. 正方验证码智能识别及教务系统模拟登录
  16. 使用wcf编写坐标字符串生成shapefile文件,在iis发布供前端调用
  17. Windows PC上创建大数据职业技能竞赛实验环境之一--基本环境的搭建
  18. 京东Java岗:来自面试官的夺命连环56问,直接当场怀疑人生~
  19. 强网杯2021 ctf线上赛ezmath wp(#超详细,带逆向新手走过一个又一个小坑)
  20. 夏普给鸿海带来哪些改变?

热门文章

  1. [转]cocos2d游戏开发,常用工具集合
  2. oracle不同库之间传送文件,EXCEL与ORACLE间的数据互传法数据库 -电脑资料
  3. 段错误、内存泄漏、内存溢出、堆溢出、栈溢出
  4. 全国计算机等级考试题库二级C操作题100套(第84套)
  5. Linux中mysql的卸载和重装,在Linux下面卸载与重新安装Postgresql
  6. 计算机nit题百度云,计算机NIT应用基础试题
  7. RocketMQ集群知识介绍
  8. Qt编译报 undefined vtable问题
  9. 办公技巧:Excel日常高频使用技巧,赶快收藏吧!
  10. 数据库设计:数据库设计的基本步骤介绍