【Golang】Interface 底层实现(未完)
接口是高级语言中的一个规约,是一组方法签名的集合。Go 的 Interface 是非侵入式的,具体类型实现 Interface 不需要在语法上显式的声明,只需要具体类型的方法集合是 Interface 方法集合的超集,就表示该类实现了这一 Interface。编译器在编译时会进行 Interface 校验,Interface 和具体类型不同,它不能实现具体逻辑,也不能定义字段。
在 Go 语言中,Interface 和函数一样,都是第一公民,Interface 可以用在任何使用变量的地方。可以作为结构体内的字段,可以作为函数的形参和返回值,可以作为其他 Interface 定义的内嵌字段。Interface 在大型项目中常常用来解耦,在层与层之间用 Interface 进行抽象和解耦,使得抽象出来的代码特别简洁,这也符合 Go 语言设计之初的哲学。
先看一个易错的例子:
1 | package main |
这将输出:
true
false
Interface 实际上包含两部分,类型和值。对于 x 而言,它的类型和值都是 nil,所以 x == nil 是 true;对于 y,它的类型是 *int,值是 nil,所以 y == nil 是 false。因此,我们在看 Interface 的时候,需要关注类型和值两部分。