Explorar el Código

Add ch11.0 ch11.1

leisore hace 10 años
padre
commit
12af762216
Se han modificado 4 ficheros con 43 adiciones y 1 borrados
  1. 1 1
      eBook/10.8.md
  2. 9 0
      eBook/11.0.md
  3. 33 0
      eBook/11.1.md
  4. BIN
      eBook/images/11.1_fig11.1.jpg

+ 1 - 1
eBook/10.8.md

@@ -26,4 +26,4 @@ func(obj *typeObj)需要一个typeObj类型的指针参数obj,特殊操作会
 ## 链接
 - [目录](directory.md)
 - 上一节:[10.7 类型的String()方法和格式化描述符](10.7.md)
-- 下一节:[11.1 什么是接口](11.1.md)
+- 下一节:[11 接口(Interfaces)与反射(reflection)](11.0.md)

+ 9 - 0
eBook/11.0.md

@@ -0,0 +1,9 @@
+# 11 接口(Interfaces)与反射(reflection)
+
+本章介绍 Go 语言中接口和反射的相关内容。
+
+## 链接
+
+- [目录](directory.md)
+- 上一章:[垃圾回收和SetFinalizer](10.8.md)
+- 下一节:[接口是什么](11.1.md)

+ 33 - 0
eBook/11.1.md

@@ -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`。它本质上是一个指针,虽然不完全是一回事。指向接口值的指针是非法的,它们不仅一点用也没有,还会导致代码错误。
+
+![](images/11.1_fig11.1.jpg?raw=true)
+
+此处的方法指针表是通过运行时反射构建的。
+
+- [目录](directory.md)
+- 上一章:[11 接口(Interfaces)与反射(reflection)](11.0.md)
+- 下一节:[接口内嵌接口](11.2.md)

BIN
eBook/images/11.1_fig11.1.jpg