Golang学习 - 反射(reflect)简单使用
Go 中的反射是用 reflect
包实现,reflect
包实现了运行时的反射能力,能够让程序操作不同的对象。反射是 Go 语言很重要的一个特性
反射的两种基本类型
反射包中有两对非常重要的函数和类型
方法名 | 描述 |
---|---|
reflect.TypeOf | 可以获得任意值的类型对象,返回类型: reflect.Type |
reflect.ValueOf | 可以获得任意值的值对象,返回类型: reflect.Value |
这两个函数的参数都是空接口 interface{}
,内部存储了即将被反射的变量。
可以将 reflect.Value
看作反射的值,reflect.Type
看作反射的实际类型。其中,reflect.Type是一个接口,包含和类型有关的许多方法签名。reflect.Value
是一个结构体,其内部包含了很多方法。
reflect.TypeOf
reflect.Type 接口具体方法列表
常用方法
方法 | 描述 |
---|---|
Kind() Kind | 返回该变量的的具体分类 |
Name() string | 返回该类型在自身包内的类型名,如果是未命名类型会返回”” |
NumField() int | 返回struct类型的字段数(匿名字段算作一个字段),如非结构体类型将 panic |
Field(i int) StructField | 返回struct类型的第i个字段的类型,如非结构体或者i不在[0, NumField())内将会 panic |
Implements(u Type) bool | 如果该类型实现了u代表的接口,会返回真 |
Len() int | 返回array类型的长度,如非数组类型将 panic |
Elem() Type | 返回该类型的元素类型,如果该类型的Kind不是 Array 、Chan 、Map 、Ptr 或 Slice ,会 panic |
Key() Type | 返回map类型的键的类型。如非映射类型将 panic |
常见的两个结构体和类型
StructField
类型描述结构体中的一个字段的信息。
1 | type StructField struct { |
StructTag
是结构体字段的标签。
1 | type StructTag string |
简单使用
1 | package main |
reflect.Value
reflect.ValueOf()
获取数据信息,返回 Value 类型。Value
被声明成了结构体。这个结构体没有对外暴露的字段,但是提供了获取或者写入数据的方法
常用方法
方法名 | 描述 |
---|---|
Field(i int) StructField | 返回结构体的第i个字段(的Value封装)。如果v的Kind不是Struct或i出界会panic |
FieldByName(name string) Value | 返回该类型名为name的字段(的Value封装)(会查找匿名字段及其子字段) |
Index(i int) Value | 返回第 i 个元素,主要用于遍历,不能越界。前提类型是 Array, Slice, String 之一, |
Set(x Value) | 通过反射修改值。 |
Type() Type | 获取值的类型 |
简单使用
1 | func ValueOf() { |