|
|
@@ -0,0 +1,33 @@
|
|
|
+# 11.1 接口是什么
|
|
|
+
|
|
|
+Go 语言不是一种 *“传统”* 的面向对象编程语言:它里面没有类和继承的概念。
|
|
|
+
|
|
|
+但是 Go 语言里有非常灵活的 **接口** 概念,通过它可以实现很多面向对象的特性。接口提供了一种方式来 **说明** 对象的行为:如果谁能搞定这件事,它就可以在用在这儿。
|
|
|
+
|
|
|
+接口定义了一组方法(方法集),但是这些方法不包含(实现)代码:它们没有被实现(它们是抽象的)。接口里也不能包含变量。
|
|
|
+
|
|
|
+通过如下格式定义接口:
|
|
|
+
|
|
|
+```go
|
|
|
+type Namer interface {
|
|
|
+ Method1(param_list) return_type
|
|
|
+ Method2(param_list) return_type
|
|
|
+ ...
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+上面的 `Namer` 是一个 **接口类型**.
|
|
|
+
|
|
|
+(按照约定,只包含一个方法的)接口的名字由方法名加 `[e]r` 后缀组成,例如 `Printer`、`Reader`、`Writer`、`Logger`、`Converter`等等。还有一些不常用的方式(当后缀`er`不合适时),比如`Recoverable`,此时接口名以`able`结尾,或者以 `I` 开头(像 `.NET` 或 `Java` 中那样)。
|
|
|
+
|
|
|
+Go 语言中的接口都很简短,通常它们会包含0个、最多3个方法。
|
|
|
+
|
|
|
+不像大多数面向对象编程语言,在 Go 语言中接口可以有值,一个接口类型的变量或一个 **接口值** :`var ai Namer`,`ai`是一个多字(multiword)数据结构,它的值是 `nil`。它本质上是一个指针,虽然不完全是一回事。指向接口值的指针是非法的,它们不仅一点用也没有,还会导致代码错误。
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+此处的方法指针表是通过运行时反射构建的。
|
|
|
+
|
|
|
+- [目录](directory.md)
|
|
|
+- 上一章:[11 接口(Interfaces)与反射(reflection)](11.0.md)
|
|
|
+- 下一节:[接口内嵌接口](11.2.md)
|