开发者学堂课程【Go语言核心编程 - 面向对象、文件、单元测试、反射、TCP编程:反射基本介绍和示意图】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/626/detail/9766
反射基本介绍和示意图
内容介绍
一、基本介绍
二、引入“reflect
一、基本介绍
1.反射可以在运行时动态获取变量的各种信息,比如变量的类型(type),类别(kind)
2.如果是结构体变量,还可以获取到结构体本身的信息(包括结构体的字段、方法)
3.通过反射,可以修改变量的值,可以调用关联的方法。
4.使用反射,需要 import(“reflect”)
package reflect
import "reflect"
reflect 包实现了运行时反射,允许程序操作任意类型的对象。典型用法是用静态类型 interfacef)保存一个值,通过调用 TypeOf 获取其动态类型信息,该函数返回一个 Type 类型值。调用 ValueO 函数返回一个 Value 类型值,该值代表运行时的数据。Zero 接受一个 Type 类型参数并返回一个代表该类型零值的 Value 类型值。
5. 示意图
二、反射的示意图
1.变量
var num int
var student Student
2.reflect.Type 类型
reflect.TypeOf
()
reflect.ValueOf(v)
3.refiect.Value 类型
type Student
{
Name string
Age int.
...
}
func (this Student) print(nint)
{
//
...
}
type Value
代码如下:
type Value struct
//内含隐或非导出字段
}
Value 为 go 值提供了反射接口。
不是所有 go 类型值的Value表示都使用所有方法。请参见每个方法的文档获取使用限制。在调用有分类限定的方法时,应先使用 Kind 方法获知该值的分类。调用该分类不支持的方法会导致运行时的 panic。
Value 类型的零值表示不持某个值,零值的 isValid 方法调回 false,其 Kind 方法派回 Invalid,而 String 方法返回”",所有其它方法都会 panic,绝大多数函数和方法都永远不返回 Value 零值,如果某个函数/方法返回了非法的 Value,它的文档必须显式的说明具体情况。
如果某个 go 类型值可以安全的用于多线程并发操作,它的 Value 表示也可以安全的用于并发。
func ValueOf
代码如下
func valueOf(i interfacefl)) Value
ValueOf 医回一个初始化为接口保营的具体值的 Value,ValueOf(nil)返回 Value 零值。
func Zero
代码如下
func Zero(typ Type)Value
Zero 返回一个持有类型 typ 的零值的 Value。注意持有零值的 Value 和 Value 零值是两回事。Value 零值表示不持有任可值,例 Zero(TypeOf(42))近回一个 Kind 为 int,值为0的 Value,Zero 的返回值不能设置也不会导址。
func New
代码如下
func New(typ Type)Value
func Neu(typ Type)Value
New 回一个 Value 类型值,该值持有一个指向类型为 typ 的新申请的零值的指针,近回值的 Tvpe 为 PtrTo(typ)
func NewAt
代码如下
func Neuat(typ Type,p unsafe.Pointer)Value
NewAt 近回一个 Value 类型值,该值持有一个指向类型为 typ、地址为 p 的值的指针。
func indirect
代码如下
func Indirect(v Value)Value
返回持有 V 持有的描针指向的值的 Value。如果 v 持有 nil 指针,会返回 Value 零值;如果 v 不持有指针,会返回 V。
func MakeSlice
type Type
type Type interface
{
// kind 返回该接口的具体分卖
Kind
()
Kind
//Name 返回该类型在白身包内的类型名:如果是未命名类型会返回""
Name() string
//PkgPath 返回类型的包路径:即明确指定包的 import 路径:如"encoding/base64”
//如果类型为内建类型(string,error)或未命名类型(*T,struct{},[ ]int),会返回""
PkaPath()string
//返回类型的字符串表示该字符串可能会使用短包名(如用 base54代替"encoding/base64”)
//也不保证每个类型的字符串表示不同。如果要比较两个类型是否相等,请直接用 Type 类型比较。
String() string
//返回要保存一个该类型的值需要多少字节:类型unsafe.sizeof Size() uintptr
//返回当从内存中申请一个该类型值时,会对齐的字节
Align()int
// 返回当该类型作为结构体的字段时,会对齐的字节数
Fieldalign() int
// 如果类型实现了 u 代表的接口:会返回真
Implerentsiu Tvpe) bool
// 如果该类型的值可以直接值给 u 代表的类型:返回真
func (v Value) Bytes()]byte
func (v Value) String() string
func (v Value) Pointer() uintptr
func (v Value) InterfaceData()[2]uintptr
func (v Value) Slice(i,j
int)Value
func (v Value) Slice3(i
,
j
,
k int) Value
func (v Value) Cap()int.func(v Value) Len()int
func (v Value) Index(i int) Value
func (v Value) Mapindex(key Value) Value
func(v Value) MapKeys()IValue.func (v Value) NumField()int func (v Value) Field(i int) Value
func (vValue) FieldByindex(index
[]
int)value
func (v Value) FieldByName(name string) Value
func (v Value) FieldByNameFunc(match func(string)bool) Value
func (v Value) Recv((xValue, ok bool)
func (v Value) TryRecv()(x Value, ok bool)
func(v Value) Send(x Value)
func (vValue) TrySend(xValue)bool
func (v Value) Close()
func (v Value) Call(in
(
Value)IValue
func (v Value) CallSlice(in iValue)Value
func(v Value) NumMethod))int
func (vValue)Method int) Value