虽然在大多数的应用和服务中并不常见,但是很多框架都依赖 Go 语言的反射机制简化代码。因为 Go 语言的语法元素很少、设计简单,所以它没有特别强的表达能力,但是 Go 语言的 reflect 包能够弥补它在语法上reflect.Type的一些劣势。
reflect 实现了运行时的反射能力,能够让程序操作不同类型的对象1。反射包中有两对非常重要的函数和类型,两个函数分别是:
reflect.TypeOf 能获取类型信息;
reflect.ValueOf 能获取数据的运行时表示;
两个类型是 reflect.Type 和 reflect.Value,它们与函数是一一对应的关系:
![](data:image/png;base64,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)
图 4-15 反射函数和类型
类型 reflect.Type 是反射包定义的一个接口,我们可以使用 reflect.TypeOf 函数获取任意变量的类型,reflect.Type 接口中定义了一些有趣的方法,MethodByName 可以获取当前类型对应方法的引用、Implements 可以判断当前类型是否实现了某个接口:
type Type interface {
Align() int
FieldAlign() int
Method(int) Method
MethodByName(string)(Method, bool)
NumMethod() int
...
Implements(u Type) bool
...
}
反射包中 reflect.Value 的类型与 reflect.Type 不同,它被声明成了结构体。这个结构体没有对外暴露的字段,但是提供了获取或者写入数据的方法:
type Value struct {
// 包含过滤的或者未导出的字段
}
func (v Value) Addr() Value
func (v Value) Bool() bool
func (v Value) Bytes() []byte
...
反射包中的所有方法基本都是围绕着 reflect.Type 和 reflect.Value 两个类型设计的。我们通过 reflect.TypeOf、reflect.ValueOf 可以将一个普通的变量转换成反射包中提供的 reflect.Type 和 reflect.Value,随后就可以使用反射包中的方法对它们进行复杂的操作。
4.3.1 三大法则
运行时反射是程序在运行期间检查其自身结构的一种方式。反射带来的灵活性是一把双刃剑,反射作为一种元编程方式可以减少重复代码2,但是过量的使用反射会使我们的程序逻辑变得难以理解并且运行缓慢。我们在这一节中会介绍 Go 语言反射的三大法则3,其中包括:
1.从 interface{} 变量可以反射出反射对象;
2.从反射对象可以获取 interface{} 变量;
3.要修改反射对象,其值必须可设置;
第一法则
反射的第一法则是我们能将 Go 语言的 interface{} 变量转换成反射对象。很多读者可能会对这以法则产生困惑 — 为什么是从 interface{} 变量到反射对象?当我们执行 reflect.ValueOf(1) 时,虽然看起来是获取了基本类型 int 对应的反射类型,但是由于 reflect.TypeOf、reflect.ValueOf 两个方法的入参都是 interface{} 类型,所以在方法执行的过程中发生了类型转换。
因为Go 语言的函数调用都是值传递的,所以变量会在函数调用时进行类型转换。基本类型 int 会转换成 interface{} 类型,这也就是为什么第一条法则是从接口到反射对象。
上面提到的 reflect.TypeOf 和 reflect.ValueOf 函数就能完成这里的转换,如果我们认为 Go 语言的类型和反射类型处于两个不同的世界,那么这两个函数就是连接这两个世界的桥梁。
![](data:image/png;base64,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)
图 4-16 接口到反射对象
我们可以通过以下例子简单介绍它们的作用,reflect.TypeOf 获取了变量 author 的类型,reflect.ValueOf 获取了变量的值 draven。如果我们知道了一个变量的类型和值,那么就意味着我们知道了这个变量的全部信息。
package main
import (
"fmt"
"reflect"
)
func main() {
author: = "draven"
fmt.Println("TypeOf author:", reflect.TypeOf(author))
fmt.Println("ValueOf author:", reflect.ValueOf(author))
}
$ go run main.go
TypeOf author: string
ValueOf author: draven
有了变量的类型之后,我们可以通过 Method 方法获得类型实现的方法,通过 Field 获取类型包含的全部字段。对于不同的类型,我们也可以调用不同的方法获取相关信息:
结构体:获取字段的数量并通过下标和字段名获取字段 StructField;
哈希表:获取哈希表的 Key 类型;
函数或方法:获取入参和返回值的类型;
…
总而言之,使用 reflect.TypeOf 和 reflect.ValueOf 能够获取 Go 语言中的变量对应的反射对象。一旦获取了反射对象,我们就能得到跟当前类型相关数据和操作,并可以使用这些运行时获取的结构执行方法。
第二法则
反射的第二法则是我们可以从反射对象可以获取 interface{} 变量。既然能够将接口类型的变量转换成反射对象,那么一定需要其他方法将反射对象还原成接口类型的变量,reflect 中的 reflect.Value.Interface 就能完成这项工作:
![](data:image/png;base64,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)
图 4-17 反射对象到接口
不过调用 reflect.Value.Interface 方法只能获得 interface{} 类型的变量,如果想要将其还原成最原始的状态还需要经过如下所示的显式类型转换:
v := reflect.ValueOf(1)
v.Interface().(int)
从反射对象到接口值的过程是从接口值到反射对象的镜面过程,两个过程都需要经历两次转换:
从接口值到反射对象:
从基本类型到接口类型的类型转换;
从接口类型到反射对象的转换;
从反射对象到接口值:
反射对象转换成接口类型;
通过显式类型转换变成原始类型;
![](data:image/png;base64,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)
图 4-18 接口和反射对象的双向转换
当然不是所有的变量都需要类型转换这一过程。如果变量本身就是 interface{} 类型的,那么它不需要类型转换,因为类型转换这一过程一般都是隐式的,所以我不太需要关心它,只有在我们需要将反射对象转换回基本类型时才需要显式的转换操作。
第三法则
Go 语言反射的最后一条法则是与值是否可以被更改有关,如果我们想要更新一个 reflect.Value,那么它持有的值一定是可以被更新的,假设我们有以下代码:
func main() {
i: = 1
v: = reflect.ValueOf(i)
v.SetInt(10)
fmt.Println(i)
}
$ go run reflect.go
panic: reflect: reflect.flag.mustBeAssignable using unaddressable value
goroutine 1[running]:
reflect.flag.mustBeAssignableSlow(0x82, 0x1014c0) / usr / local / go / src / reflect / value.go: 247 + 0x180
reflect.flag.mustBeAssignable(...) / usr / local / go / src / reflect / value.go: 234
reflect.Value.SetInt(0x100dc0, 0x414020, 0x82, 0x1840, 0xa, 0x0) / usr / local / go / src / reflect / value.go: 1606 + 0x40
main.main() / tmp / sandbox590309925 / prog.go: 11 + 0xe0
运行上述代码会导致程序崩溃并报出 “reflect: reflect.flag.mustBeAssignable using unaddressable value” 错误,仔细思考一下就能够发现出错的原因:由于 Go 语言的函数调用都是传值的,所以我们得到的反射对象跟最开始的变量没有任何关系,那么直接修改反射对象无法改变原始变量,程序为了防止错误就会崩溃。
想要修改原变量只能使用如下的方法:
func main() {
i: = 1
v: = reflect.ValueOf( & i)
v.Elem().SetInt(10)
fmt.Println(i)
}
$ go run reflect.go
10
1.调用 reflect.ValueOf 获取变量指针;
2.调用 reflect.Value.Elem 获取指针指向的变量;
3.调用 reflect.Value.SetInt 更新变量的值:
由于 Go 语言的函数调用都是值传递的,所以我们只能只能用迂回的方式改变原变量:先获取指针对应的 reflect.Value,再通过 reflect.Value.Elem 方法得到可以被设置的变量,我们可以通过下面的代码理解这个过程:
func main() {
i: = 1
v: = & i * v = 10
}
如果不能直接操作 i 变量修改其持有的值,我们就只能获取 i 变量所在地址并使用 *v 修改所在地址中存储的整数。
4.3.2 类型和值
Go 语言的 interface{} 类型在语言内部是通过 reflect.emptyInterface 结体表示的,其中的 rtype 字段用于表示变量的类型,另一个 word 字段指向内部封装的数据:
type emptyInterface struct {
typ * rtype
word unsafe.Pointer
}
用于获取变量类型的 reflect.TypeOf 函数将传入的变量隐式转换成 reflect.emptyInterface 类型并获取其中存储的类型信息 reflect.rtype:
func TypeOf(i interface {}) Type {
eface: = * ( * emptyInterface)(unsafe.Pointer( & i))
return toType(eface.typ)
}
func toType(t * rtype) Type {
if t == nil {
return nil
}
return t
}
reflect.rtype 是一个实现了 reflect.Type 接口的结构体,该结构体实现的 reflect.rtype.String 方法可以帮助我们获取当前类型的名称:
func(t * rtype) String() string {
s: = t.nameOff(t.str).name()
if t.tflag & tflagExtraStar != 0 {
return s[1: ]
}
return s
}
reflect.TypeOf 的实现原理其实并不复杂,它只是将一个 interface{} 变量转换成了内部的 reflect.emptyInterface 表示,然后从中获取相应的类型信息。
用于获取接口值 reflect.Value 的函数 reflect.ValueOf 实现也非常简单,在该函数中我们先调用了 reflect.escapes 保证当前值逃逸到堆上,然后通过 reflect.unpackEface 从接口中获取 reflect.Value 结构体:
func ValueOf(i interface {}) Value {
if i == nil {
return Value {}
}
escapes(i)
return unpackEface(i)
}
func unpackEface(i interface {}) Value {
e: = ( * emptyInterface)(unsafe.Pointer( & i))
t: = e.typ
if t == nil {
return Value {}
}
f: = flag(t.Kind())
if ifaceIndir(t) {
f |= flagIndir
}
return Value {
t, e.word, f
}
}
reflect.unpackEface 会将传入的接口转换成 reflect.emptyInterface,然后将具体类型和指针包装成 reflect.Value 结构体后返回。
reflect.TypeOf 和 reflect.ValueOf 的实现都很简单。我们已经分析了这两个函数的实现,现在需要了解编译器在调用函数之前做了哪些工作:
package main
import (
"reflect"
)
func main() {
i: = 20
_ = reflect.TypeOf(i)
}
$ go build - gcflags = "-S -N"
main.go
...
MOVQ $20, ""..autotmp_20 + 56(SP) // autotmp = 20
LEAQ type.int(SB), AX // AX = type.int(SB)
MOVQ AX, ""..autotmp_19 + 280(SP) // autotmp_19+280(SP) = type.int(SB)
LEAQ ""..autotmp_20 + 56(SP), CX // CX = 20
MOVQ CX, ""..autotmp_19 + 288(SP) // autotmp_19+288(SP) = 20
...
从上面这段截取的汇编语言,我们可以发现在函数调用之前已经发生了类型转换,上述指令将 int 类型的变量转换成了占用 16 字节 autotmp_19+280(SP) ~ autotmp_19+288(SP) 的接口,两个 LEAQ 指令分别获取了类型的指针 type.int(SB) 以及变量 i 所在的地址。
当我们想要将一个变量转换成反射对象时,Go 语言会在编译期间完成类型转换,将变量的类型和值转换成了 interface{} 并等待运行期间使用 reflect 包获取接口中存储的信息。
4.3.3 更新变量
当我们想要更新 reflect.Value 时,就需要调用 reflect.Value.Set 更新反射对象,该方法会调用 reflect.flag.mustBeAssignable 和 reflect.flag.mustBeExported 分别检查当前反射对象是否是可以被设置的以及字段是否是对外公开的:
func(v Value) Set(x Value) {
v.mustBeAssignable()
x.mustBeExported()
var target unsafe.Pointer
if v.kind() == Interface {
target = v.ptr
}
x = x.assignTo("reflect.Set", v.typ, target)
typedmemmove(v.typ, v.ptr, x.ptr)
}
reflect.Value.Set 会调用 reflect.Value.assignTo 并返回一个新的反射对象,这个返回的反射对象指针会直接覆盖原反射变量。
func(v Value) assignTo(context string, dst * rtype, target unsafe.Pointer) Value {
...
switch {
case directlyAssignable(dst, v.typ):
...
return Value {
dst, v.ptr, fl
}
case implements(dst, v.typ):
if v.Kind() == Interface && v.IsNil() {
return Value {
dst, nil, flag(Interface)
}
}
x: = valueInterface(v, false)
if dst.NumMethod() == 0 { * ( * interface {})(target) = x
} else {
ifaceE2I(dst, x, target)
}
return Value {
dst, target, flagIndir | flag(Interface)
}
}
panic(context + ": value of type " + v.typ.String() + " is not assignable to type " + dst.String())
}
reflect.Value.assignTo 会根据当前和被设置的反射对象类型创建一个新的 reflect.Value 结构体:
如果两个反射对象的类型是可以被直接替换,就会直接返回目标反射对象;
如果当前反射对象是接口并且目标对象实现了接口,就会把目标对象简单包装成接口值;
在变量更新的过程中,reflect.Value.assignTo 返回的 reflect.Value 中的指针会覆盖当前反射对象中的指针实现变量的更新。
4.3.4 实现协议
reflect 包还为我们提供了 reflect.rtype.Implements 方法可以用于判断某些类型是否遵循特定的接口。在 Go 语言中获取结构体的反射类型 reflect.Type 还是比较容易的,但是想要获得接口类型需要通过以下方式:
reflect.TypeOf((*<interface>)(nil)).Elem()
我们通过一个例子在介绍如何判断一个类型是否实现了某个接口。假设我们需要判断如下代码中的 CustomError 是否实现了 Go 语言标准库中的 error 接口:
type CustomError struct {}
func( * CustomError) Error() string {
return ""
}
func main() {
typeOfError: = reflect.TypeOf(( * error)(nil)).Elem()
customErrorPtr: = reflect.TypeOf( & CustomError {})
customError: = reflect.TypeOf(CustomError {})
fmt.Println(customErrorPtr.Implements(typeOfError)) // #=> true
fmt.Println(customError.Implements(typeOfError)) // #=> false
}
上述代码的运行结果正如我们在接口一节中介绍的:
CustomError 类型并没有实现 error 接口;
*CustomError 指针类型实现了 error 接口;
抛开上述的执行结果不谈,我们来分析一下 reflect.rtype.Implements 方法的工作原理:
func(t * rtype) Implements(u Type) bool {
if u == nil {
panic("reflect: nil type passed to Type.Implements")
}
if u.Kind() != Interface {
panic("reflect: non-interface type passed to Type.Implements")
}
return implements(u.( * rtype), t)
}
reflect.rtype.Implements 会检查传入的类型是不是接口,如果不是接口或者是空值就会直接崩溃并中止当前程序。在参数没有问题的情况下,上述方法会调用私有函数 reflect.implements 判断类型之间是否有实现关系:
func implements(T, V * rtype) bool {
t: = ( * interfaceType)(unsafe.Pointer(T))
if len(t.methods) == 0 {
return true
}
...
v: = V.uncommon()
i: = 0
vmethods: = v.methods()
for j: = 0;j < int(v.mcount);j++{
tm: = & t.methods[i]
tmName: = t.nameOff(tm.name)
vm: = vmethods[j]
vmName: = V.nameOff(vm.name)
if vmName.name() == tmName.name() && V.typeOff(vm.mtyp) == t.typeOff(tm.typ) {
if i++;
i >= len(t.methods) {
return true
}
}
}
return false
}
如果接口中不包含任何方法,就意味着这是一个空的接口,任意类型都自动实现该接口,这时会直接返回 true。
![](data:image/png;base64,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)
图 4-19 类型实现接口
在其他情况下,由于方法都是按照字母序存储的,reflect.implements 会维护两个用于遍历接口和类型方法的索引 i 和 j 判断类型是否实现了接口,因为最多只会进行 n 次比较(类型的方法数量),所以整个过程的时间复杂度是 O(n)。
4.3.5 方法调用
作为一门静态语言,如果我们想要通过 reflect 包利用反射在运行期间执行方法不是一件容易的事情,下面的十几行代码就使用反射来执行 Add(0, 1) 函数:
func Add(a, b int) int {
return a + b
}
func main() {
v: = reflect.ValueOf(Add)
if v.Kind() != reflect.Func {
return
}
t: = v.Type()
argv: = make([] reflect.Value, t.NumIn())
for i: = range argv {
if t.In(i).Kind() != reflect.Int {
return
}
argv[i] = reflect.ValueOf(i)
}
result: = v.Call(argv)
if len(result) != 1 || result[0].Kind() != reflect.Int {
return
}
fmt.Println(result[0].Int()) // #=> 1
}
1.通过 reflect.ValueOf 获取函数 Add 对应的反射对象;
2.调用 reflect.rtype.NumIn 获取函数的入参个数;
3.多次调用 reflect.ValueOf 函数逐一设置 argv 数组中的各个参数;
4.调用反射对象 Add 的 reflect.Value.Call 方法并传入参数列表;
5.获取返回值数组、验证数组的长度以及类型并打印其中的数据;
使用反射来调用方法非常复杂,原本只需要一行代码就能完成的工作,现在需要十几行代码才能完成,但这也是在静态语言中使用动态特性需要付出的成本。
func(v Value) Call( in [] Value)[] Value {
v.mustBe(Func)
v.mustBeExported()
return v.call("Call", in )
}
reflect.Value.Call 是运行时调用方法的入口,它通过两个 MustBe 开头的方法确定了当前反射对象的类型是函数以及可见性,随后调用 reflect.Value.call 完成方法调用,这个私有方法的执行过程会分成以下的几个部分:
检查输入参数以及类型的合法性;
将传入的 reflect.Value 参数数组设置到栈上;
通过函数指针和输入参数调用函数;
从栈上获取函数的返回值;
我们将按照上面的顺序分析使用 reflect 进行函数调用的几个过程。
参数检查
参数检查是通过反射调用方法的第一步,在参数检查期间我们会从反射对象中取出当前的函数指针 unsafe.Pointer,如果该函数指针是方法,那么我们会通过 reflect.methodReceiver 获取方法的接收者和函数指针。
func(v Value) call(op string, in [] Value)[] Value {
t: = ( * funcType)(unsafe.Pointer(v.typ))
...
if v.flag & flagMethod != 0 {
rcvr = v
rcvrtype, t, fn = methodReceiver(op, v, int(v.flag) >> flagMethodShift)
} else {
...
}
n: = t.NumIn()
if len( in ) < n {
panic("reflect: Call with too few input arguments")
}
if len( in ) > n {
panic("reflect: Call with too many input arguments")
}
for i: = 0;i < n;i++{
if xt, targ: = in [i].Type(), t.In(i);
!xt.AssignableTo(targ) {
panic("reflect: " + op + " using " + xt.String() + " as type " + targ.String())
}
}
上述方法还会检查传入参数的个数以及参数的类型与函数签名中的类型是否可以匹配,任何参数的不匹配都会导致整个程序的崩溃中止。
准备参数
当我们已经对当前方法的参数完成验证后,就会进入函数调用的下一个阶段,为函数调用准备参数,在前面函数调用一节中,我们已经介绍过 Go 语言的函数调用惯例,函数或者方法在调用时,所有的参数都会被依次放到栈上。
nout: = t.NumOut()
frametype, _, retOffset, _, framePool: = funcLayout(t, rcvrtype)
var args unsafe.Pointer
if nout == 0 {
args = framePool.Get().(unsafe.Pointer)
} else {
args = unsafe_New(frametype)
}
off: = uintptr(0)
if rcvrtype != nil {
storeRcvr(rcvr, args)
off = ptrSize
}
for i, v: = range in {
targ: = t.In(i).( * rtype)
a: = uintptr(targ.align)
off = (off + a - 1) & ^ (a - 1)
n: = targ.size
...
addr: = add(args, off, "n > 0")
v = v.assignTo("reflect.Value.Call", targ, addr) * ( * unsafe.Pointer)(addr) = v.ptr
off += n
}
通过 reflect.funcLayout 计算当前函数需要的参数和返回值的栈布局,也就是每一个参数和返回值所占的空间大小;
如果当前函数有返回值,需要为当前函数的参数和返回值分配一片内存空间 args;
如果当前函数是方法,需要向将方法的接收接收者者拷贝到 args 内存中;
将所有函数的参数按照顺序依次拷贝到对应 args 内存中
使用 reflect.funcLayout 返回的参数计算参数在内存中的位置;
将参数拷贝到内存空间中;
准备参数是计算各个参数和返回值占用的内存空间并将所有的参数都拷贝内存空间对应位置的过程,该过程会考虑函数和方法、返回值数量以及参数类型带来的差异。
调用函数
准备好调用函数需要的全部参数后,就会通过下面的代码执行函数指针了。我们会向该函数传入栈类型、函数指针、参数和返回值的内存空间、栈的大小以及返回值的偏移量:
call(frametype, fn, args, uint32(frametype.size), uint32(retOffset))
上述函数实际上并不存在,它会在编译期间链接到 reflect.reflectcall 这个用汇编实现的函数上,我们在这里不会分析该函数的具体实现,感兴趣的读者可以自行了解其实现原理。
处理返回值
当函数调用结束之后,就会开始处理函数的返回值:
如果函数没有任何返回值,会直接清空 args 中的全部内容来释放内存空间;
如果当前函数有返回值;
将 args 中与输入参数有关的内存空间清空;
创建一个 nout 长度的切片用于保存由反射对象构成的返回值数组;
从函数对象中获取返回值的类型和内存大小,将 args 内存中的数据转换成 reflect.Value 类型并存储到切片中;
var ret[] Value
if nout == 0 {
typedmemclr(frametype, args)
framePool.Put(args)
} else {
typedmemclrpartial(frametype, args, 0, retOffset)
ret = make([] Value, nout)
off = retOffset
for i: = 0;
i < nout;
i++{
tv: = t.Out(i)
a: = uintptr(tv.Align())
off = (off + a - 1) & ^ (a - 1)
if tv.Size() != 0 {
fl: = flagIndir | flag(tv.Kind())
ret[i] = Value {
tv.common(), add(args, off, "tv.Size() != 0"), fl
}
} else {
ret[i] = Zero(tv)
}
off += tv.Size()
}
}
return ret
}
由 reflect.Value 构成的 ret 数组会被返回到调用方,到这里为止使用反射实现函数调用的过程就结束了。
4.3.6 小结
Go 语言的 reflect 包为我们提供了多种能力,包括如何使用反射来动态修改变量、判断类型是否实现了某些接口以及动态调用方法等功能,通过分析反射包中方法的原理能帮助我们理解之前看起来比较怪异、令人困惑的现象。