mirror of
https://github.com/unknwon/the-way-to-go_ZH_CN.git
synced 2025-08-12 00:43:26 +08:00
@@ -105,13 +105,13 @@ func main() {
|
||||
|
||||
any hello is a special String!
|
||||
|
||||
**练习 11.9** simple_interface3.go:
|
||||
**练习 11.9** [simple_interface3.go](exercises\chapter_11\simple_interface3.go):
|
||||
|
||||
继续练习 11.2,在它中添加一个 `gI` 函数,它不再接受 `Simpler` 类型的参数,而是接受一个空接口参数。然后通过类型断言判断参数是否是 `Simpler` 类型。最后在 `main` 使用 `gI` 取代 `fI` 函数并调用它。确保你的代码足够安全。
|
||||
继续练习 11.2,在它中添加一个 `gI()` 函数,它不再接受 `Simpler` 类型的参数,而是接受一个空接口参数。然后通过类型断言判断参数是否是 `Simpler` 类型。最后在 `main` 使用 `gI()` 取代 `fI()` 函数并调用它。确保你的代码足够安全。
|
||||
|
||||
## 11.9.2 构建通用类型或包含不同类型变量的数组
|
||||
|
||||
在 7.6.6 中我们看到了能被搜索和排序的 `int` 数组、`float` 数组以及 `string` 数组,那么对于其他类型的数组呢,是不是我们必须得自己编程实现它们?
|
||||
在 [7.6.6](07.6.md) 中我们看到了能被搜索和排序的 `int` 数组、`float` 数组以及 `string` 数组,那么对于其他类型的数组呢,是不是我们必须得自己编程实现它们?
|
||||
|
||||
现在我们知道该怎么做了,就是通过使用空接口。让我们给空接口定一个别名类型 `Element`:`type Element interface{}`
|
||||
|
||||
@@ -141,9 +141,9 @@ func (p *Vector) Set(i int, e Element) {
|
||||
|
||||
`Vector` 中存储的所有元素都是 `Element` 类型,要得到它们的原始类型(unboxing:拆箱)需要用到类型断言。TODO:The compiler rejects assertions guaranteed to fail,类型断言总是在运行时才执行,因此它会产生运行时错误。
|
||||
|
||||
**练习 11.10** min_interface.go / minmain.go:
|
||||
**练习 11.10** [min_interface.go](exercises\chapter_11\min_interface.go) / [minmain.go](exercises\chapter_11\minmain.go):
|
||||
|
||||
仿照 11.7 中开发的 `Sorter` 接口,创建一个 `Miner` 接口并实现一些必要的操作。函数 `Min` 接受一个 `Miner` 类型变量的集合,然后计算并返回集合中最小的元素。
|
||||
仿照 11.7 中开发的 `Sorter` 接口,创建一个 `Miner` 接口并实现一些必要的操作。函数 `Min()` 接受一个 `Miner` 类型变量的集合,然后计算并返回集合中最小的元素。
|
||||
|
||||
## 11.9.3 复制数据切片至空接口切片
|
||||
|
||||
@@ -170,7 +170,7 @@ for i, d := range dataSlice {
|
||||
|
||||
## 11.9.4 通用类型的节点数据结构
|
||||
|
||||
在 10.1 中我们遇到了诸如列表和树这样的数据结构,在它们的定义中使用了一种叫节点的递归结构体类型,节点包含一个某种类型的数据字段。现在可以使用空接口作为数据字段的类型,这样我们就能写出通用的代码。下面是实现一个二叉树的部分代码:通用定义、用于创建空节点的 `NewNode` 方法,及设置数据的 `SetData` 方法。
|
||||
在 [10.1](10.1.md) 中我们遇到了诸如列表和树这样的数据结构,在它们的定义中使用了一种叫节点的递归结构体类型,节点包含一个某种类型的数据字段。现在可以使用空接口作为数据字段的类型,这样我们就能写出通用的代码。下面是实现一个二叉树的部分代码:通用定义、用于创建空节点的 `NewNode` 方法,及设置数据的 `SetData` 方法。
|
||||
|
||||
示例 11.10 [node_structures.go](examples/chapter_11/node_structures.go):
|
||||
|
||||
@@ -246,7 +246,7 @@ func f3(x myInterface) {
|
||||
}
|
||||
```
|
||||
|
||||
`x` 转换为 `myPrintInterface` 类型是完全动态的:只要 `x` 的底层类型(动态类型)定义了 `print` 方法这个调用就可以正常运行(译注:若 `x` 的底层类型未定义 `print` 方法,此处类型断言会导致 `panic`,最佳实践应该为 `if mpi, ok := x.(myPrintInterface); ok { mpi.print() }`,参考 11.3 章节)。
|
||||
`x` 转换为 `myPrintInterface` 类型是完全动态的:只要 `x` 的底层类型(动态类型)定义了 `print` 方法这个调用就可以正常运行(译注:若 `x` 的底层类型未定义 `print` 方法,此处类型断言会导致 `panic`,最佳实践应该为 `if mpi, ok := x.(myPrintInterface); ok { mpi.print() }`,参考 [11.3](11.3.md) 章节)。
|
||||
|
||||
## 链接
|
||||
|
||||
|
Reference in New Issue
Block a user