@@ -248,7 +248,9 @@ a)
b) 使用一个抽象类型 `Shape`(没有字段) 实现同样的功能,它实现接口 `Shaper`,然后在其他类型里内嵌此类型。扩展 10.6.5 中的例子来说明覆写。
+## 链接
+
- [目录](directory.md)
-- 上一章:[接口(Interfaces)与反射(reflection)](11.0.md)
+- 上一节:[接口(Interfaces)与反射(reflection)](11.0.md)
- 下一节:[接口嵌套接口](11.2.md)
@@ -22,6 +22,8 @@ type File interface {
}
```
- 上一节:[接口是什么](11.1.md)
- 下一节:[如何检测和转换接口变量的类型:类型断言](11.3.md)
@@ -91,6 +91,8 @@ func (ci *Circle) Area() float32 {
如果忽略 `areaIntf.(*Square)` 中的 `*` 号,会导致编译错误:`impossible type assertion: Square does not implement Shaper (Area method has pointer receiver)`。
- 上一节:[接口嵌套接口](11.2.md)
- 下一节:[类型判断:type-switch](11.4.md)
@@ -71,6 +71,8 @@ func classifier(items ...interface{}) {
接着 练习 11.1 中的内容,创建第二个类型 `RSimple`,它也实现了接口 `Simpler`,写一个函数 `fi`,它可以区分 `Simple` 和 `RSimple` 类型的变量。
- 上一节:[类型断言:如何检测和转换接口变量的类型](11.3.md)
- 下一节:[测试一个值是否实现了某个接口](11.5.md)
@@ -24,6 +24,8 @@ if sv, ok := v.(Stringer); ok {
在接下来的章节中,我们会讨论两个重要的例子,试着去深入理解它们,这样你就可以更好的应用上面的原则。
- 上一节:[类型判断:type-switch](11.4.md)
- 下一节:[使用方法集与接口](11.6.md)
@@ -86,6 +86,8 @@ Go
- 类型 T 的可调用方法集包含接受者为 T 的所有方法
- 类型 T 的可调用方法集不包含接受者为 *T 的方法
- 上一节:[测试一个值是否实现了某个接口](11.5.md)
- 下一节:[第一个例子:使用Sorter接口排序](11.7.md)
@@ -221,6 +221,7 @@ b).
定义一个结构体 `Person`,它有两个字段:`firstName` 和 `lastName`,为 `[]Person` 定义类型 `Persons` 。让 `Persons` 实现 `Sorter` 接口并进行测试。
- 上一节:[使用方法集与接口](11.6.md)
@@ -22,6 +22,8 @@ type Writer interface {
例如一个 `JPEG` 图形解码器,通过一个 `Reader` 参数,它可以解码来自磁盘、网络连接或以 `gzip` 压缩的 `HTTP` 流中的 `JPEG`图形数据,或者其他任何实现了`Reader` 接口的对象。
- 上一节:[第一个例子:使用Sorter接口排序](11.7.md)
- 下一节:[空接口](11.9.md)
@@ -248,6 +248,8 @@ func f3(x myInterface) {
`x` 转换为 `myPrintInterface` 类型是完全动态的:只要 `x` 的底层类型(动态类型)定义了 `print` 方法这个调用就可以正常运行。
- 上一节:[第二个例子:读和写](11.8.md)
- 下一节:[反射包](11.10.md)