diff --git a/eBook/11.12.md b/eBook/11.12.md index f49213c..84ff1db 100644 --- a/eBook/11.12.md +++ b/eBook/11.12.md @@ -10,7 +10,7 @@ Go 中的接口跟 Java/C# 类似:都是必须提供一个指定方法集的 和其它语言相比,Go 是唯一结合了接口值,静态类型检查(是否该类型实现了某个接口),运行时动态转换的语言,并且不需要显式地声明类型是否满足某个接口。该特性允许我们在不改变已有的代码的情况下定义和使用新接口。 -接收一个(或多个)接口类型作为参数的函数,其实参可以是任何实现了该接口的类型。 `实现了某个接口的类型可以被传给任何以此接口为参数的函数` 。 +接收一个(或多个)接口类型作为参数的函数,其**实参**可以是任何实现了该接口的类型的变量。 `实现了某个接口的类型可以被传给任何以此接口为参数的函数` 。 类似于 Python 和 Ruby 这类动态语言中的 `动态类型(duck typing)`;这意味着对象可以根据提供的方法被处理(例如,作为参数传递给函数),而忽略它们的实际类型:它们能做什么比它们是什么更重要。 @@ -275,17 +275,17 @@ type ReaderWriter struct { 在练习 7.13 中我们定义了一个 map 函数来使用 int 切片 (map_function.go)。 -通过空接口和类型断言,现在我们可以写一个可以应用于许多类型的 `泛型` 的 map 函数,为 int 和 string 构建一个把 int 值加倍和连接字符串值的 map 函数 `mapFunc`。 - +通过空接口和类型断言,现在我们可以写一个可以应用于许多类型的 `泛型` 的 map 函数,为 int 和 string 构建一个把 int 值加倍和将字符串值与其自身连接(译者注:即`"abc"`变成`"abcabc"`)的 map 函数 `mapFunc`。 + 提示:为了可读性可以定义一个 interface{} 的别名,比如:type obj interface{} **练习 11.12**:[map_function_interface_var.go](exercises/chapter_11/map_function_interface_var.go): -稍微改变练习 11.9,允许 `mapFunc` 接收不定数量的 items。 +稍微改变练习 11.11,允许 `mapFunc` 接收不定数量的 items。 **练习 11.13**:[main_stack.go](exercises/chapter_11/main_stack.go)—[stack/stack_general.go](exercises/chapter_11/stack/stack_general.go): -在练习 10.10 和 10.11 中我们开发了一些栈结构类型。但是它们被限制为某种固定的内建类型。现在用一个元素类型是 interface{}(空接口)的切片开发一个通用的栈类型。 +在练习 10.16 和 10.17 中我们开发了一些栈结构类型。但是它们被限制为某种固定的内建类型。现在用一个元素类型是 interface{}(空接口)的切片开发一个通用的栈类型。 实现下面的栈方法: @@ -293,7 +293,7 @@ type ReaderWriter struct { Len() int IsEmpty() bool Push(x interface{}) -Pop() (x interface{}, error) +Pop() (interface{}, error) ``` `Pop()` 改变栈并返回最顶部的元素;`Top()` 只返回最顶部元素。