-
Notifications
You must be signed in to change notification settings - Fork 1
/
3、反射.txt
executable file
·98 lines (63 loc) · 3.34 KB
/
3、反射.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
1、概念
在运行时更新变量和检查他们的值、调用它们的方法
指程序在运行的过程中,获取对象的类型信息和内存结构
2、常用场景
1>对于一个函数,不知道传给你的参数类型是什么,可能是没约定好;也可能是传入的类型很多,这些类型并不能统一表示
;这时反射就会用上了
2>有时候需要根据某些条件决定调用哪个函数,比如根据用户的输入来决定。这时就需要对函数和函数的参数进行反射,在运
行期间动态地执行函数
3、缺点
可读性差
对于错误,反射代码是无能为力
影响性能
4、实现
反射就是通过接口的类型信息实现的,建立在类型的基础上
interface空接口
reflect包
reflect包实现了运行时反射,允许程序操作任意类型的对象。典型用法是用静态类型interface{}保存一个值,
通过调用TypeOf获取其动态类型信息,该函数返回一个Type类型值。调用ValueOf函数返回一个Value类型值,
该值代表运行时的数据。Zero接受一个Type类型参数并返回一个代表该类型零值的Value类型值
最重要的两个类型
type Type interface {
...
}
type Value struct {
// 内含隐藏或非导出字段
}
5、引申概念
Go语言的类型
变量包括type、value两部分
type包括static type和concrete type。
static type 是看的见的类型 int、string等
concrete type 是runtime系统看见的类型
类型断言能否成功,取决于变量的concrete type;
如果一个reader变量的concrete type也实现了write方法的话,也可以被类型断言为writer
Go语言的反射就是建立在类型之上的,反射主要与Golang的interface类型相关(type是concrete type)
只有interface类型才有反射一说
每个interface变量都有一个对应pair, pair中记录了实际变量的值和类型(value, type)
一个interface{}类型的变量包含了2个指针,一个指向值的类型【concrete type】,一个指向实际值【value】
6、使用
reflect包
基本功能
TypeOf
ValueOf
1>func ValueOf(i interface{}) Value
用来获取输入参数接口中的数据的值,如果接口为空则返回0
2>func TypeOf(i interface{}) Type
用来获取输入参数接口中的值的类型,如果接口为空则返回nil
reflect.TypeOf()来获取pair中type
reflect.ValueOf()来获取pair中value
7、静态类型和动态类型
编译时就知道变量类型的是静态类型
运行时才知道的变量类型叫做动态类型
var A interface{}//静态类型interface{}
A = 10 //静态类型interface{} 动态为int
A = "string" //静态类型interface{} 动态为string
var M *int
A = M //A的值可以改变
8、反射规则
反射可以从接口值得到反射对象
检测存储在interface中的类型和值机制;通过TypeOf和ValueOf得到
反射可以从反射对象获得接口值
将ValueOf的返回值通过interface()函数反向转变成interface变量
操作一个反射变量,则其值必须可以修改