|
@@ -26,17 +26,17 @@ Go
|
|
|
|
|
|
|
|

|
|

|
|
|
|
|
|
|
|
-此处的方法指针表是通过运行时反射构建的。
|
|
|
|
|
|
|
+此处的方法指针表是通过运行时反射能力构建的。
|
|
|
|
|
|
|
|
-类型(比如结构体)实现接口方法集中的方法,每一个方法的实现说明了此方法是如何作用于该类型的:** 它们实现接口 **,同时方法集也构成了该类型的接口。实现了 `Namer` 接口类型的变量可以赋值给 `ai` (接收者值),此时方法表中的指针会指向被实现的接口方法。当然如果另一个类型(也实现了该接口)的变量被赋值给`ai`,这二者(译者注:指针和方法实现)也会随之改变。
|
|
|
|
|
|
|
+类型(比如结构体)实现接口方法集中的方法,每一个方法的实现说明了此方法是如何作用于该类型的:**即实现接口**,同时方法集也构成了该类型的接口。实现了 `Namer` 接口类型的变量可以赋值给 `ai` (接收者值),此时方法表中的指针会指向被实现的接口方法。当然如果另一个类型(也实现了该接口)的变量被赋值给`ai`,这二者(译者注:指针和方法实现)也会随之改变。
|
|
|
|
|
|
|
|
-** 类型不需要显式声明它实现了某个接口:接口被隐式地实现。多个类型可以实现同一个接口 **。
|
|
|
|
|
|
|
+**类型不需要显式声明它实现了某个接口:接口被隐式地实现。多个类型可以实现同一个接口**。
|
|
|
|
|
|
|
|
-** 实现某个接口的类型(除了实现接口方法外)可以有其他的方法**。
|
|
|
|
|
|
|
+**实现某个接口的类型(除了实现接口方法外)可以有其他的方法**。
|
|
|
|
|
|
|
|
-** 一个类型可以实现多个接口 **。
|
|
|
|
|
|
|
+**一个类型可以实现多个接口**。
|
|
|
|
|
|
|
|
-** 接口类型可以包含一个实例的引用, 该实例的类型实现了此接口(接口是动态类型) **。
|
|
|
|
|
|
|
+**接口类型可以包含一个实例的引用, 该实例的类型实现了此接口(接口是动态类型)**。
|
|
|
|
|
|
|
|
即使接口在类型之后才定义,二者处于不同的包中,被单独编译:只要类型实现了接口中的方法,它就实现了此接口。
|
|
即使接口在类型之后才定义,二者处于不同的包中,被单独编译:只要类型实现了接口中的方法,它就实现了此接口。
|
|
|
|
|
|
|
@@ -83,7 +83,7 @@ func main() {
|
|
|
|
|
|
|
|
上面的程序定义了一个结构体 `Square` 和一个接口 `Shaper`,接口有一个方法 `Area()`。
|
|
上面的程序定义了一个结构体 `Square` 和一个接口 `Shaper`,接口有一个方法 `Area()`。
|
|
|
|
|
|
|
|
-在 `main()` 方法中创建了一个 `Square` 的实例。在主程序外边定义了一个接收者类型是 `Square`方法 `Area()`,用来计算正方形的面积:结构体 `Square` 实现了接口 `Shaper` 。
|
|
|
|
|
|
|
+在 `main()` 方法中创建了一个 `Square` 的实例。在主程序外边定义了一个接收者类型是 `Square`方法的 `Area()`,用来计算正方形的面积:结构体 `Square` 实现了接口 `Shaper` 。
|
|
|
|
|
|
|
|
所以可以将一个 `Square` 类型的变量赋值给一个接口类型的变量:`areaIntf = sq1` 。
|
|
所以可以将一个 `Square` 类型的变量赋值给一个接口类型的变量:`areaIntf = sq1` 。
|
|
|
|
|
|
|
@@ -207,7 +207,7 @@ func main() {
|
|
|
Value of the asset is 2308.800049
|
|
Value of the asset is 2308.800049
|
|
|
Value of the asset is 66500.000000
|
|
Value of the asset is 66500.000000
|
|
|
|
|
|
|
|
-** 一个标准库的例子 **
|
|
|
|
|
|
|
+**一个标准库的例子**
|
|
|
|
|
|
|
|
`io`包里有一个接口类型 `Reader`:
|
|
`io`包里有一个接口类型 `Reader`:
|
|
|
|
|
|