Go 语言中的接口是一组方法的签名,它是 Go 语言的重要组成部分。使用接口能够让我们写出易于测试的代码,然而很多工程师对 Go 的接口了解都非常有限,也不清楚其底层的实现原理,这成为了开发高性能服务的阻碍。
本节会介绍使用接口时遇到的一些常见问题以及它的设计与实现,包括接口的类型转换、类型断言以及动态派发机制,帮助各位读者更好地理解接口类型。
4.2.1 概述
在计算机科学中,接口是计算机系统中多个组件共享的边界,不同的组件能够在边界上交换信息1。如下图所示,接口的本质是引入一个新的中间层,调用方可以通过接口与具体实现分离,解除上下游的耦合,上层的模块不再需要依赖下层的具体模块,只需要依赖一个约定好的接口。
![](data:image/png;base64,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)
图 4-5 上下游通过接口解耦
这种面向接口的编程方式有着非常强大的生命力,无论是在框架还是操作系统中我们都能够找到接口的身影。可移植操作系统接口(Portable Operating System Interface,POSIX)2就是一个典型的例子,它定义了应用程序接口和命令行等标准,为计算机软件带来了可移植性 — 只要操作系统实现了 POSIX,计算机软件就可以直接在不同操作系统上运行。
除了解耦有依赖关系的上下游,接口还能够帮助我们隐藏底层实现,减少关注点。《计算机程序的构造和解释》中有这么一句话:
代码必须能够被人阅读,只是机器恰好可以执行3
人能够同时处理的信息非常有限,定义良好的接口能够隔离底层的实现,让我们将重点放在当前的代码片段中。SQL 就是接口的一个例子,当我们使用 SQL 语句查询数据时,其实不需要关心底层数据库的具体实现,我们只在乎 SQL 返回的结果是否符合预期。
![](data:image/png;base64,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)
图 4-6 SQL 和不同数据库
计算机科学中的接口是比较抽象的概念,但是编程语言中接口的概念就更加具体。Go 语言中的接口是一种内置的类型,它定义了一组方法的签名,本节会介绍 Go 语言接口的几个基本概念以及常见问题,为后面的实现原理做铺垫。
隐式接口
很多面向对象语言都有接口这一概念,例如 Java 和 C#。Java 的接口不仅可以定义方法签名,还可以定义变量,这些定义的变量可以直接在实现接口的类中使用,这里简单介绍一下 Java 中的接口:
public interface MyInterface {
public String hello = "Hello";
public void sayHello();
}
上述代码定义了一个必须实现的方法 sayHello 和一个会注入到实现类的变量 hello。在下面的代码中,MyInterfaceImpl 实现了 MyInterface 接口:
public class MyInterfaceImpl implements MyInterface {
public void sayHello() {
System.out.println(MyInterface.hello);
}
}
Java 中的类必须通过上述方式显式地声明实现的接口,但是在 Go 语言中实现接口就不需要使用类似的方式。首先,我们简单了解一下在 Go 语言中如何定义接口。定义接口需要使用 interface 关键字,在接口中我们只能定义方法签名,不能包含成员变量,一个常见的 Go 语言接口是这样的:
type error interface {
Error() string
}
如果一个类型需要实现 error 接口,那么它只需要实现 Error() string 方法,下面的 RPCError 结构体就是 error 接口的一个实现:
type RPCError struct {
Code int64
Message string
}
func(e * RPCError) Error() string {
return fmt.Sprintf("%s, code=%d", e.Message, e.Code)
}
细心的读者可能会发现上述代码根本就没有 error 接口的影子,这是为什么呢?Go 语言中接口的实现都是隐式的,我们只需要实现 Error() string 方法就实现了 error 接口。Go 语言实现接口的方式与 Java 完全不同:
1.在 Java 中:实现接口需要显式地声明接口并实现所有方法;
2.在 Go 中:实现接口的所有方法就隐式地实现了接口;
我们使用上述 RPCError 结构体时并不关心它实现了哪些接口,Go 语言只会在传递参数、返回参数以及变量赋值时才会对某个类型是否实现接口进行检查,这里举几个例子来演示发生接口类型检查的时机:
func main() {
var rpcErr error = NewRPCError(400, "unknown err") // typecheck1
err: = AsErr(rpcErr) // typecheck2
println(err)
}
func NewRPCError(code int64, msg string) error {
return &RPCError { // typecheck3
Code: code,
Message: msg,
}
}
func AsErr(err error) error {
return err
}
Go 语言在编译期间对代码进行类型检查,上述代码总共触发了三次类型检查:
将 *RPCError 类型的变量赋值给 error 类型的变量 rpcErr;
将 *RPCError 类型的变量 rpcErr 传递给签名中参数类型为 error 的 AsErr 函数;
将 *RPCError 类型的变量从函数签名的返回值类型为 error 的 NewRPCError 函数中返回;
从类型检查的过程来看,编译器仅在需要时才检查类型,类型实现接口时只需要实现接口中的全部方法,不需要像 Java 等编程语言中一样显式声明。
类型
接口也是 Go 语言中的一种类型,它能够出现在变量的定义、函数的入参和返回值中并对它们进行约束,不过 Go 语言中有两种略微不同的接口,一种是带有一组方法的接口,另一种是不带任何方法的 interface{}:
![](data:image/png;base64,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)
图 4-7 Go 语言中的两种接口
Go 语言使用 runtime.iface 表示第一种接口,使用 runtime.eface 表示第二种不包含任何方法的接口 interface{},两种接口虽然都使用 interface 声明,但是由于后者在 Go 语言中很常见,所以在实现时使用了特殊的类型。
需要注意的是,与 C 语言中的 void * 不同,interface{} 类型不是任意类型。如果我们将类型转换成了 interface{} 类型,变量在运行期间的类型也会发生变化,获取变量类型时会得到 interface{}。
package main
func main() {
type Test struct {}
v: = Test {}
Print(v)
}
func Print(v interface {}) {
println(v)
}
上述函数不接受任意类型的参数,只接受 interface{} 类型的值,在调用 Print 函数时会对参数 v 进行类型转换,将原来的 Test 类型转换成 interface{} 类型,本节会在后面介绍类型转换的实现原理。
指针和接口
在 Go 语言中同时使用指针和接口时会发生一些让人困惑的问题,接口在定义一组方法时没有对实现的接收者做限制,所以我们会看到某个类型实现接口的两种方式:
![](data:image/png;base64,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)
图 4-8 结构体和指针实现接口
这是因为结构体类型和指针类型是不同的,就像我们不能向一个接受指针的函数传递结构体一样,在实现接口时这两种类型也不能划等号。虽然两种类型不同,但是上图中的两种实现不可以同时存在,Go 语言的编译器会在结构体类型和指针类型都实现一个方法时报错 “method redeclared”。
对 Cat 结构体来说,它在实现接口时可以选择接受者的类型,即结构体或者结构体指针,在初始化时也可以初始化成结构体或者指针。下面的代码总结了如何使用结构体、结构体指针实现接口,以及如何使用结构体、结构体指针初始化变量。
type Cat struct {}
type Duck interface { ... }
func (c Cat) Quack {} // 使用结构体实现接口
func (c *Cat) Quack {} // 使用结构体指针实现接口
var d Duck = Cat{} // 使用结构体初始化变量
var d Duck = &Cat{} // 使用结构体指针初始化变量
实现接口的类型和初始化返回的类型两个维度共组成了四种情况,然而这四种情况不是都能通过编译器的检查:
![](data:image/png;base64,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)
四种中只有使用指针实现接口,使用结构体初始化变量无法通过编译,其他的三种情况都可以正常执行。当实现接口的类型和初始化变量时返回的类型时相同时,代码通过编译是理所应当的:
.方法接受者和初始化类型都是结构体;
.方法接受者和初始化类型都是结构体指针;
而剩下的两种方式为什么一种能够通过编译,另一种无法通过编译呢?我们先来看一下能够通过编译的情况,即方法的接受者是结构体,而初始化的变量是结构体指针:
type Cat struct {}
func(c Cat) Quack() {
fmt.Println("meow")
}
func main() {
var c Duck = & Cat {}
c.Quack()
}
作为指针的 &Cat{} 变量能够隐式地获取到指向的结构体,所以能在结构体上调用 Walk 和 Quack 方法。我们可以将这里的调用理解成 C 语言中的 d->Walk() 和 d->Speak(),它们都会先获取指向的结构体再执行对应的方法。
但是如果我们将上述代码中方法的接受者和初始化的类型进行交换,代码就无法通过编译了:
type Duck interface {
Quack()
}
type Cat struct {}
func(c * Cat) Quack() {
fmt.Println("meow")
}
func main() {
var c Duck = Cat {}
c.Quack()
}
$ go build interface.go
. / interface.go: 20: 6: cannot use Cat literal(type Cat) as type Duck in assignment:
Cat does not implement Duck(Quack method has pointer receiver)
编译器会提醒我们:Cat 类型没有实现 Duck 接口,Quack 方法的接受者是指针。这两个报错对于刚刚接触 Go 语言的开发者比较难以理解,如果我们想要搞清楚这个问题,首先要知道 Go 语言在传递参数时都是传值的。
![](data:image/png;base64,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)
图 4-9 实现接口的接受者类型
如上图所示,无论上述代码中初始化的变量 c 是 Cat{} 还是 &Cat{},使用 c.Quack() 调用方法时都会发生值拷贝:
如上图左侧,对于 &Cat{} 来说,这意味着拷贝一个新的 &Cat{} 指针,这个指针与原来的指针指向一个相同并且唯一的结构体,所以编译器可以隐式的对变量解引用(dereference)获取指针指向的结构体;
如上图右侧,对于 Cat{} 来说,这意味着 Quack 方法会接受一个全新的 Cat{},因为方法的参数是 *Cat,编译器不会无中生有创建一个新的指针;即使编译器可以创建新指针,这个指针指向的也不是最初调用该方法的结构体;
上面的分析解释了指针类型的现象,当我们使用指针实现接口时,只有指针类型的变量才会实现该接口;当我们使用结构体实现接口时,指针类型和结构体类型都会实现该接口。当然这并不意味着我们应该一律使用结构体实现接口,这个问题在实际工程中也没那么重要,在这里我们只想解释现象背后的原因。
nil 和 non-nil
我们可以通过一个例子理解Go 语言的接口类型不是任意类型这一句话,下面的代码在 main 函数中初始化了一个 *TestStruct 类型的变量,由于指针的零值是 nil,所以变量 s 在初始化之后也是 nil:
package main
type TestStruct struct {}
func NilOrNot(v interface {}) bool {
return v == nil
}
func main() {
var s * TestStruct
fmt.Println(s == nil) // #=> true
fmt.Println(NilOrNot(s)) // #=> false
}
$ go run main.go
true
false
我们简单总结一下上述代码执行的结果:
.将上述变量与 nil 比较会返回 true;
.将上述变量传入 NilOrNot 方法并与 nil 比较会返回 false;
出现上述现象的原因是 —— 调用 NilOrNot 函数时发生了隐式的类型转换,除了向方法传入参数之外,变量的赋值也会触发隐式类型转换。在类型转换时,*TestStruct 类型会转换成 interface{} 类型,转换后的变量不仅包含转换前的变量,还包含变量的类型信息 TestStruct,所以转换后的变量与 nil 不相等。
4.2.2 数据结构
相信各位读者已经对 Go 语言的接口有了一些的了解,接下来我们从源代码和汇编指令层面介绍接口的底层数据结构。
Go 语言根据接口类型是否包含一组方法将接口类型分成了两类:
1.使用 runtime.iface 结构体表示包含方法的接口
2.使用 runtime.eface 结构体表示不包含任何方法的 interface{} 类型;
runtime.eface 结构体在 Go 语言中的定义是这样的:
type eface struct { // 16 字节
_type *_type
data unsafe.Pointer
}
由于 interface{} 类型不包含任何方法,所以它的结构也相对来说比较简单,只包含指向底层数据和类型的两个指针。从上述结构我们也能推断出 — Go 语言的任意类型都可以转换成 interface{}。
另一个用于表示接口的结构体是 runtime.iface,这个结构体中有指向原始数据的指针 data,不过更重要的是 runtime.itab 类型的 tab 字段。
type iface struct { // 16 字节
tab * itab
data unsafe.Pointer
}
接下来我们将详细分析 Go 语言接口中的这两个类型,即 runtime._type 和 runtime.itab。
类型结构体
runtime._type 是 Go 语言类型的运行时表示。下面是运行时包中的结构体,其中包含了很多类型的元信息,例如:类型的大小、哈希、对齐以及种类等。
type _type struct {
size uintptr
ptrdata uintptr
hash uint32
tflag tflag
align uint8
fieldAlign uint8
kind uint8
equal func(unsafe.Pointer, unsafe.Pointer) bool
gcdata * byte
str nameOff
ptrToThis typeOff
}
size 字段存储了类型占用的内存空间,为内存空间的分配提供信息;
hash 字段能够帮助我们快速确定类型是否相等;
equal 字段用于判断当前类型的多个对象是否相等,该字段是为了减少 Go 语言二进制包大小从 typeAlg 结构体中迁移过来的4;
我们只需要对 runtime._type 结构体中的字段有一个大体的概念,不需要详细理解所有字段的作用和意义。
itab 结构体
runtime.itab 结构体是接口类型的核心组成部分,每一个 runtime.itab 都占 32 字节,我们可以将其看成接口类型和具体类型的组合,它们分别用 inter 和 _type 两个字段表示:
type itab struct { // 32 字节
inter * interfacetype
_type * _type
hash uint32
_[4] byte
fun[1] uintptr
}
除了 inter 和 _type 两个用于表示类型的字段之外,上述结构体中的另外两个字段也有自己的作用:
hash 是对 _type.hash 的拷贝,当我们想将 interface 类型转换成具体类型时,可以使用该字段快速判断目标类型和具体类型 runtime._type 是否一致;
fun 是一个动态大小的数组,它是一个用于动态派发的虚函数表,存储了一组函数指针。虽然该变量被声明成大小固定的数组,但是在使用时会通过原始指针获取其中的数据,所以 fun 数组中保存的元素数量是不确定的;
我们会在类型断言中介绍 hash 字段的使用,在动态派发一节中介绍 fun 数组中存储的函数指针是如何被使用的。
4.2.3 类型转换
既然我们已经了解了接口在运行时的数据结构,接下来会通过几个例子来深入理解接口类型是如何初始化和传递的,本节会介绍在实现接口时使用指针类型和结构体类型的区别。这两种不同的接口实现方式会导致 Go 语言编译器生成不同的汇编代码,进而影响最终的处理过程。
指针类型
首先回到这一节开头提到的 Duck 接口的例子,我们使用 //go:noinline 指令5禁止 Quack 方法的内联编译:
package main
type Duck interface {
Quack()
}
type Cat struct {
Name string
}
//go:noinline
func(c * Cat) Quack() {
println(c.Name + " meow")
}
func main() {
var c Duck = & Cat {
Name: "draven"
}
c.Quack()
}
我们使用编译器将上述代码编译成汇编语言、删掉一些对理解接口原理无用的指令并保留与赋值语句 var c Duck = &Cat{Name: "draven"} 相关的代码,这里将生成的汇编指令拆分成三部分分析:
1.结构体 Cat 的初始化;
2.赋值触发的类型转换过程;
3.调用接口的方法 Quack();
我们先来分析结构体 Cat 的初始化过程:
LEAQ type."".Cat(SB), AX ;; AX = &type."".Cat
MOVQ AX, (SP) ;; SP = &type."".Cat
CALL runtime.newobject(SB) ;; SP + 8 = &Cat{}
MOVQ 8(SP), DI ;; DI = &Cat{}
MOVQ $6, 8(DI) ;; StringHeader(DI.Name).Len = 6
LEAQ go.string."draven"(SB), AX ;; AX = &"draven"
MOVQ AX, (DI) ;; StringHeader(DI.Name).Data = &"draven"
1.获取 Cat 结构体类型指针并将其作为参数放到栈上;
2.通过 CALL 指定调用 runtime.newobject 函数,这个函数会以 Cat 结构体类型指针作为入参,分配一片新的内存空间并将指向这片内存空间的指针返回到 SP+8 上;
3.SP+8 现在存储了一个指向 Cat 结构体的指针,我们将栈上的指针拷贝到寄存器 DI 上方便操作;
4.由于 Cat 中只包含一个字符串类型的 Name 变量,所以在这里会分别将字符串地址 &"draven" 和字符串长度 6 设置到结构体上,最后三行汇编指令等价于 cat.Name = "draven";
字符串在运行时的表示是指针加上字符串长度,在前面的章节字符串已经介绍过它的底层表示和实现原理,但是这里要看一下初始化之后的 Cat 结构体在内存中的表示是什么样的:
![](data:image/png;base64,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mdUUskVkVsoLBYlFo9ngO6akpBjDMNizey8AiUSCgwcPU1RcNG6mwJGRzHZtre309fczb37LSZ+ztq6aQF6AN17bSDrtMBwZYdeuPTQ05mbki86OTmzbw8c/cSX/5t//kIvXXUTrkTYikUh2nVB+iOHIMNHR8cF+/74DjIyMcMPNn2bZBUuJRqPjQnJ1TTXRaIz9e/dnlx053DpuHz6/j9u//iWuv/E6Duw/xKa338vJcYmIzESqyRaRWWnx4oW8/MIr/Oh//BO1dbVEY1H+6vvfpLSslKuvuYLnnnmeHdt2EY1GsW2b2753bJpu13X5w+/uJ78gRH/fADV11axdv/qkz+nxeLjsY5fwzFPP8aP/+c9ER6N4vV4+dvklZ3w8juNy3x8foruzh7LyUoqKCjl44BDlFWXkh0LZ9ZavWMrbb73D3/+X/0ldfS2u6/LNv7ydouIiXBd+dcddBAL+zMgqx9Vbr1l7EW9vfIc7f/17iouLGB4ZwTAM/vpvvkNhUWaEFL/PR1l5CYFAgCuv/hgP/+kxGhrnUFZWesbHJyIy02h0ERGZtfr6+mlrbSeRSFBeXk5dfU02WHZ2dNHV2Y3P76O6pio71N72bTv53Z1/4NYv/AWu6+L1eairryMv79Ru8HMch66uHjrbO/EH/NTUVk8Yxm94eISuzm7mNszBtk99aEDHcejq7GZwcIiR4VFKy0qoqa2aMMZ2b08vba0dpNIpKirKqa2rwTAMOto7aW/vpKSkmJraanp7eikoLKDgaE14IpGko72Dvt5+QvkhKqsqsm3v7eljZGSU+jm1mKaJ4zgcPnSE/Px8So8rjxERmS0UskVEPoTt23by29/8gW9956vMmVs/3c0REZGPKNVki4h8SKZpTpikRURE5HjqyRYR+RBc18VJO5iWgraIiJyYbnwUEfkQDMPA+hB10iIiMjupXEREREREJMcUskVEREREckwhW0REREQkxxSyRURERERyTCFbRERERCTHFLJFRERERHJMIVtEREREJMcUskVEREREckwhW0REREQkxxSyRURERERyTCFbRERERCTHFLJFRERERHJMIVtEREREJMcUskVEREREckwhW0REREQkxxSyRURERERyTCFbRERERCTH/n+R8CK289C5BAAAAABJRU5ErkJggg==)
图 4-10 Cat 结构体指针
因为 Cat 结构体的定义中只包含一个字符串,而字符串在 Go 语言中总共占 16 字节,所以每一个 Cat 结构体的大小都是 16 字节。初始化 Cat 结构体之后就进入了将 *Cat 转换成 Duck 类型的过程了:
LEAQ go.itab.*"".Cat, "".Duck(SB), AX;;
AX = * itab(go.itab.*"".Cat, "".Duck)
MOVQ DI, (SP);;
SP = AX
类型转换的过程比较简单,Duck 作为一个包含方法的接口,它在底层使用 runtime.iface 结构体表示。runtime.iface 结构体包含两个字段,其中一个是指向数据的指针,另一个是表示接口和结构体关系的 tab 字段,我们已经通过上一段代码 SP+8 初始化了 Cat 结构体指针,这段代码只是将编译期间生成的 runtime.itab 结构体指针复制到 SP 上:
![](data:image/png;base64,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)
图 4-11 Cat 类型转换
到这里,我们会发现 SP ~ SP+16 共同组成了 runtime.iface 结构体,而栈上的这个 runtime.iface 也是 Quack 方法的第一个入参。
CALL "".(*Cat).Quack(SB) ;; SP.Quack()
上述代码会直接通过 CALL 指令完成方法的调用,细心的读者可能会发现一个问题 —— 为什么在代码中我们调用的是 Duck.Quack 但生成的汇编是 *Cat.Quack 呢?Go 语言的编译器会在编译期间将一些需要动态派发的方法调用改写成对目标方法的直接调用,以减少性能的额外开销。如果在这里禁用编译器优化,就会看到动态派发的过程,我们会在后面分析接口的动态派发以及性能上的额外开销。
结构体类型
在这里我们继续修改上一节中的代码,使用结构体类型实现 Duck 接口并初始化结构体类型的变量:
package main
type Duck interface {
Quack()
}
type Cat struct {
Name string
}
//go:noinline
func(c Cat) Quack() {
println(c.Name + " meow")
}
func main() {
var c Duck = Cat {
Name: "draven"
}
c.Quack()
}
如果我们在初始化变量时使用指针类型 &Cat{Name: "draven"} 也能够通过编译,不过生成的汇编代码和上一节中的几乎完全相同,所以这里也就不分析这个情况了。
编译上述代码会得到如下所示的汇编指令,需要注意的是为了代码更容易理解和分析,这里的汇编指令依然经过了删减,不过不影响具体的执行过程。与上一节一样,我们将汇编代码的执行过程分成以下几个部分:
1.初始化 Cat 结构体;
2.完成从 Cat 到 Duck 接口的类型转换;
3.调用接口的 Quack 方法;
我们先来看一下上述汇编代码中用于初始化 Cat 结构体的部分:
XORPS X0, X0 ;; X0 = 0
MOVUPS X0, ""..autotmp_1+32(SP) ;; StringHeader(SP+32).Data = 0
LEAQ go.string."draven"(SB), AX ;; AX = &"draven"
MOVQ AX, ""..autotmp_1+32(SP) ;; StringHeader(SP+32).Data = AX
MOVQ $6, ""..autotmp_1+40(SP) ;; StringHeader(SP+32).Len = 6
这段汇编指令会在栈上初始化 Cat 结构体,而上一节的代码在堆上申请了 16 字节的内存空间,栈上只有一个指向 Cat 的指针。
初始化结构体后会进入类型转换的阶段,编译器会将 go.itab."".Cat,"".Duck 的地址和指向 Cat 结构体的指针作为参数一并传入 runtime.convT2I 函数:
LEAQ go.itab.
"".Cat, "".Duck(SB), AX;;
AX = & (go.itab.
"".Cat, "".Duck)
MOVQ AX, (SP);;
SP = AX
LEAQ ""..autotmp_1 + 32(SP), AX;;
AX = & (SP + 32) = & Cat {
Name: "draven"
}
MOVQ AX, 8(SP);;
SP + 8 = AX
CALL runtime.convT2I(SB);;
runtime.convT2I(SP, SP + 8)
这个函数会获取 runtime.itab 中存储的类型,根据类型的大小申请一片内存空间并将 elem 指针中的内容拷贝到目标的内存中:
func convT2I(tab * itab, elem unsafe.Pointer)(i iface) {
t: = tab._type
x: = mallocgc(t.size, t, true)
typedmemmove(t, x, elem)
i.tab = tab
i.data = x
return
}
runtime.convT2I 会返回一个 runtime.iface,其中包含 runtime.itab 指针和 Cat 变量。当前函数返回之后,main 函数的栈上会包含以下数据:
![](data:image/png;base64,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)
图 4-12 结构体到指针
SP 和 SP+8 中存储的 runtime.itab 和 Cat 指针是 runtime.convT2I 函数的入参,这个函数的返回值位于 SP+16,是一个占 16 字节内存空间的 runtime.iface 结构体,SP+32 存储的是在栈上的 Cat 结构体,它会在 runtime.convT2I 执行的过程中拷贝到堆上。
在最后,我们会通过以下的指令调用 Cat 实现的接口方法 Quack():
MOVQ 16(SP), AX ;; AX = &(go.itab."".Cat,"".Duck)
MOVQ 24(SP), CX ;; CX = &Cat{Name: "draven"}
MOVQ 24(AX), AX ;; AX = AX.fun[0] = Cat.Quack
MOVQ CX, (SP) ;; SP = CX
CALL AX ;; CX.Quack()
这几个汇编指令还是非常好理解的,MOVQ 24(AX), AX 是最关键的指令,它从 runtime.itab 结构体中取出 Cat.Quack 方法指针作为 CALL 指令调用时的参数。接口变量的第 24 字节是 itab.fun 数组开始的位置,由于 Duck 接口只包含一个方法,所以 itab.fun[0] 中存储的就是指向 Quack 方法的指针了。
4.2.4 类型断言
上一节介绍是如何把具体类型转换成接口类型,而这一节介绍的是如何将一个接口类型转换成具体类型。本节会根据接口中是否存在方法分两种情况介绍类型断言的执行过程。
非空接口
首先分析接口中包含方法的情况,Duck 接口一个非空的接口,我们来分析从 Duck 转换回 Cat 结构体的过程:
func main() {
var c Duck = & Cat {
Name: "draven"
}
switch c.(type) {
case *Cat:
cat: = c.( * Cat)
cat.Quack()
}
}
我们将编译得到的汇编指令分成两部分分析,第一部分是变量的初始化,第二部分是类型断言,第一部分的代码如下:
00000 TEXT "".main(SB), ABIInternal, $32-0
...
00029 XORPS X0, X0
00032 MOVUPS X0, ""..autotmp_4+8(SP)
00037 LEAQ go.string."draven"(SB), AX
00044 MOVQ AX, ""..autotmp_4+8(SP)
00049 MOVQ $6, ""..autotmp_4+16(SP)
0037 ~ 0049 三个指令初始化了 Duck 变量,Cat 结构体初始化在 SP+8 ~ SP+24 上。因为 Go 语言的编译器做了一些优化,所以代码中没有runtime.iface 的构建过程,不过对于这一节要介绍的类型断言和转换没有太多的影响。下面进入类型转换的部分:
00058 CMPL go.itab.*"".Cat,"".Duck+16(SB), $593696792
;; if (c.tab.hash != 593696792) {
00068 JEQ 80 ;;
00070 MOVQ 24(SP), BP ;; BP = SP+24
00075 ADDQ $32, SP ;; SP += 32
00079 RET ;; return
;; } else {
00080 LEAQ ""..autotmp_4+8(SP), AX ;; AX = &Cat{Name: "draven"}
00085 MOVQ AX, (SP) ;; SP = AX
00089 CALL "".(*Cat).Quack(SB) ;; SP.Quack()
00094 JMP 70 ;; ...
;; BP = SP+24
;; SP += 32
;; return
;; }
switch语句生成的汇编指令会将目标类型的 hash 与接口变量中的 itab.hash 进行比较:
1.如果两者相等意味着变量的具体类型是 Cat,我们会跳转到 0080 所在的分支完成类型转换。
.获取 SP+8 存储的 Cat 结构体指针;
.将结构体指针拷贝到栈顶;
.调用 Quack 方法;
.恢复函数的栈并返回;
2.如果接口中存在的具体类型不是 Cat,就会直接恢复栈指针并返回到调用方;
![](data:image/png;base64,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)
图 4-13 接口转换成结构体
上图展示了调用 Quack 方法时的堆栈情况,其中 Cat 结构体存储在 SP+8 ~ SP+24 上,Cat 指针存储在栈顶并指向上述结构体。
空接口
当我们使用空接口类型 interface{} 进行类型断言时,如果不关闭 Go 语言编译器的优化选项,生成的汇编指令是差不多的。编译器会省略将 Cat 结构体转换成 runtime.eface 的过程:
func main() {
var c interface {} = & Cat {
Name: "draven"
}
switch c.(type) {
case *Cat:
cat: = c.( * Cat)
cat.Quack()
}
}
如果禁用编译器优化,上述代码会在类型断言时就不是直接获取变量中具体类型的 runtime._type,而是从 eface._type 中获取,汇编指令仍然会使用目标类型的 hash 与变量的类型比较。
4.2.5 动态派发
动态派发(Dynamic dispatch)是在运行期间选择具体多态操作(方法或者函数)执行的过程,它是面向对象语言中的常见特性6。Go 语言虽然不是严格意义上的面向对象语言,但是接口的引入为它带来了动态派发这一特性,调用接口类型的方法时,如果编译期间不能确认接口的类型,Go 语言会在运行期间决定具体调用该方法的哪个实现。
在如下所示的代码中,main 函数调用了两次 Quack 方法:
第一次以 Duck 接口类型的身份调用,调用时需要经过运行时的动态派发;
第二次以 *Cat 具体类型的身份调用,编译期就会确定调用的函数:
func main() {
var c Duck = & Cat {
Name: "draven"
}
c.Quack()
c.( * Cat).Quack()
}
因为编译器优化影响了我们对原始汇编指令的理解,所以需要使用编译参数 -N 关闭编译器优化。如果不指定这个参数,编译器会对代码进行重写,与最初生成的执行过程有一些偏差,例如:
因为接口类型中的 tab 参数并没有被使用,所以优化从 Cat 转换到 Duck 的过程;
因为变量的具体类型是确定的,所以删除从 Duck 接口类型转换到 *Cat 具体类型时可能会发生崩溃的分支;
…
在具体分析调用 Quack 方法的两种姿势之前,我们要先了解 Cat 结构体究竟是如何初始化的,以及初始化后的栈上有哪些数据:
LEAQ type."".Cat(SB), AX
MOVQ AX, (SP)
CALL runtime.newobject(SB) ;; SP + 8 = new(Cat)
MOVQ 8(SP), DI ;; DI = SP + 8
MOVQ DI, ""..autotmp_2+32(SP) ;; SP + 32 = DI
MOVQ $6, 8(DI) ;; StringHeader(cat).Len = 6
LEAQ go.string."draven"(SB), AX ;; AX = &"draven"
MOVQ AX, (DI) ;; StringHeader(cat).Data = AX
MOVQ ""..autotmp_2+32(SP), AX ;; AX = &Cat{...}
MOVQ AX, ""..autotmp_1+40(SP) ;; SP + 40 = &Cat{...}
LEAQ go.itab.*"".Cat,"".Duck(SB), CX ;; CX = &go.itab.*"".Cat,"".Duck
MOVQ CX, "".c+48(SP) ;; iface(c).tab = SP + 48 = CX
MOVQ AX, "".c+56(SP) ;; iface(c).data = SP + 56 = AX
这段代码的初始化过程其实和上两节中的过程没有太多的差别,它先初始化了 Cat 结构体指针,再将 Cat 和 tab 打包成了一个 runtime.iface 类型的结构体,我们直接来看初始化结束后的栈情况:
![](data:image/png;base64,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)
图 4-14 接口类型初始化后的栈
SP 是 Cat 类型,它也是运行时 runtime.newobject 方法的参数;
SP+8 是 runtime.newobject 方法的返回值,即指向堆上的 Cat 结构体的指针;
SP+32、SP+40 是对 SP+8 的拷贝,这两个指针都会指向堆上的 Cat 结构体;
SP+48 ~ SP+64 是接口变量 runtime.iface 结构体,其中包含了 tab 结构体指针和 *Cat 指针;
初始化过程结束后,就进入到了动态派发的过程,c.Quack() 语句展开的汇编指令会在运行时确定函数指针。
MOVQ "".c+48(SP), AX ;; AX = iface(c).tab
MOVQ 24(AX), AX ;; AX = iface(c).tab.fun[0] = Cat.Quack
MOVQ "".c+56(SP), CX ;; CX = iface(c).data
MOVQ CX, (SP) ;; SP = CX = &Cat{...}
CALL AX ;; SP.Quack()
这段代码的执行过程可以分成以下三个步骤:
1.从接口变量中获取保存 Cat.Quack 方法指针的 tab.func[0];
2.接口变量在 runtime.iface 中的数据会被拷贝到栈顶;
3.方法指针会被拷贝到寄存器中并通过汇编指令 CALL 触发:
另一个调用 Quack 方法的语句 c.(*Cat).Quack() 生成的汇编指令看起来会有一些复杂,但是代码前半部分都是在做类型转换,将接口类型转换成 *Cat 类型,只有最后两行代码才是函数调用相关的指令:
MOVQ "".c + 56(SP), AX;;
AX = iface(c).data = & Cat {...
}
MOVQ "".c + 48(SP), CX;;
CX = iface(c).tab
LEAQ go.itab.*"".Cat, "".Duck(SB), DX;;
DX = && go.itab.*"".Cat, "".Duck
CMPQ CX, DX;;
CMP(CX, DX)
JEQ 163
JMP 201
MOVQ AX, ""..autotmp_3 + 24(SP);;
SP + 24 = & Cat {...
}
MOVQ AX, (SP);;
SP = & Cat {...
}
CALL "".( * Cat).Quack(SB);;
SP.Quack()
下面的几行代码只是将 Cat 指针拷贝到了栈顶并调用 Quack 方法。这一次调用的函数指针在编译期就已经确定了,所以运行时就不需要动态查找方法的实现:
MOVQ "".c + 48(SP), AX;;
AX = iface(c).tab
MOVQ 24(AX), AX;;
AX = iface(c).tab.fun[0] = Cat.Quack
MOVQ "".c + 56(SP), CX;;
CX = iface(c).data
两次方法调用对应的汇编指令差异就是动态派发带来的额外开销,这些额外开销在有低延时、高吞吐量需求的服务中是不能被忽视的,我们来详细分析一下产生的额外汇编指令对性能造成的影响。
基准测试
下面代码中的两个方法 BenchmarkDirectCall 和 BenchmarkDynamicDispatch 分别会调用结构体方法和接口方法,在接口上调用方法时会使用动态派发机制,我们以直接调用作为基准分析动态派发带来了多少额外开销:
func BenchmarkDirectCall(b * testing.B) {
c: = & Cat {
Name: "draven"
}
for n: = 0;n < b.N;n++{
// MOVQ AX, "".c+24(SP)
// MOVQ AX, (SP)
// CALL "".(*Cat).Quack(SB)
c.Quack()
}
}
func BenchmarkDynamicDispatch(b * testing.B) {
c: = Duck( & Cat {
Name: "draven"
})
for n: = 0;n < b.N;n++{
// MOVQ "".d+56(SP), AX
// MOVQ 24(AX), AX
// MOVQ "".d+64(SP), CX
// MOVQ CX, (SP)
// CALL AX
c.Quack()
}
}
我们直接运行下面的命令,使用 1 个 CPU 运行上述代码,每一个基准测试都会被执行 3 次:
$ go test - gcflags = -N - benchmem - test.count = 3 - test.cpu = 1 - test.benchtime = 1 s - bench = .
goos: darwin
goarch: amd64
pkg: github.com / golang / playground
BenchmarkDirectCall 500000000 3.11 ns / op 0 B / op 0 allocs / op
BenchmarkDirectCall 500000000 2.94 ns / op 0 B / op 0 allocs / op
BenchmarkDirectCall 500000000 3.04 ns / op 0 B / op 0 allocs / op
BenchmarkDynamicDispatch 500000000 3.40 ns / op 0 B / op 0 allocs / op
BenchmarkDynamicDispatch 500000000 3.79 ns / op 0 B / op 0 allocs / op
BenchmarkDynamicDispatch 500000000 3.55 ns / op 0 B / op 0 allocs / op
调用结构体方法时,每一次调用需要 ~3.03ns;
使用动态派发时,每一调用需要 ~3.58ns;
在关闭编译器优化的情况下,从上面的数据来看,动态派发生成的指令会带来 ~18% 左右的额外性能开销。
这些性能开销在一个复杂的系统中不会带来太多的影响。一个项目不可能只使用动态派发,而且如果我们开启编译器优化后,动态派发的额外开销会降低至 ~5%,这对应用性能的整体影响就更小了,所以与使用接口带来的好处相比,动态派发的额外开销往往可以忽略。
上面的性能测试建立在实现和调用方法的都是结构体指针上,当我们将结构体指针换成结构体又会有比较大的差异:
func BenchmarkDirectCall(b * testing.B) {
c: = Cat {
Name: "draven"
}
for n: = 0;n < b.N;n++{
// MOVQ AX, (SP)
// MOVQ $6, 8(SP)
// CALL "".Cat.Quack(SB)
c.Quack()
}
}
func BenchmarkDynamicDispatch(b * testing.B) {
c: = Duck(Cat {
Name: "draven"
})
for n: = 0;n < b.N;n++{
// MOVQ 16(SP), AX
// MOVQ 24(SP), CX
// MOVQ AX, "".d+32(SP)
// MOVQ CX, "".d+40(SP)
// MOVQ "".d+32(SP), AX
// MOVQ 24(AX), AX
// MOVQ "".d+40(SP), CX
// MOVQ CX, (SP)
// CALL AX
c.Quack()
}
}
当我们重新执行相同的基准测试时,会得到如下所示的结果:
$ go test - gcflags = -N - benchmem - test.count = 3 - test.cpu = 1 - test.benchtime = 1 s.
goos: darwin
goarch: amd64
pkg: github.com / golang / playground
BenchmarkDirectCall 500000000 3.15 ns / op 0 B / op 0 allocs / op
BenchmarkDirectCall 500000000 3.02 ns / op 0 B / op 0 allocs / op
BenchmarkDirectCall 500000000 3.09 ns / op 0 B / op 0 allocs / op
BenchmarkDynamicDispatch 200000000 6.92 ns / op 0 B / op 0 allocs / op
BenchmarkDynamicDispatch 200000000 6.91 ns / op 0 B / op 0 allocs / op
BenchmarkDynamicDispatch 200000000 7.10 ns / op 0 B / op 0 allocs / op
直接调用方法需要消耗时间的平均值和使用指针实现接口时差不多,约为 ~3.09ns,而使用动态派发调用方法却需要 ~6.98ns 相比直接调用额外消耗了 ~125% 的时间,从生成的汇编指令我们也能看出后者的额外开销会高很多。
从上述表格我们可以看到使用结构体实现接口带来的开销会大于使用指针实现,而动态派发在结构体上的表现非常差,这也提醒我们应当尽量避免使用结构体类型实现接口。
使用结构体带来的巨大性能差异不只是接口带来的问题,带来性能问题主要因为 Go 语言在函数调用时是传值的,动态派发的过程只是放大了参数拷贝带来的影响。
4.2.6 小结
重新回顾一下本节介绍的内容,我们在开头简单介绍了使用 Go 语言接口的常见问题,例如使用不同类型实现接口带来的差异、函数调用时发生的隐式类型转换;我们还分析了接口的类型转换、类型断言以及动态派发机制,相信这一节的内容能够帮助各位深入理解 Go 语言的接口。