This commit is contained in:
Unknwon
2015-09-08 06:18:41 -04:00
parent d977e88e8a
commit c1b14feb5c
6 changed files with 26 additions and 15 deletions

View File

@@ -9,7 +9,7 @@
## 翻译进度
10.8 [垃圾回收和 SetFinalizer](eBook/10.8.md)
11.1 [接口是什么](eBook/11.1.md)
## 支持本书

View File

@@ -8,6 +8,15 @@
本书的主要译者是 [@无闻Unknwon](http://www.weibo.com/Obahua),是一名 Go 语言爱好者和传播者,目前是 [Go Walker](https://gowalker.org)、Gopm、[Gogs](http://gogs.io) 和 [Macaron](https://github.com/Unknwon/macaron) 创始人,极客学院签约讲师。
目前已由多位 Go 语言爱好者共同提交翻译内容,主要包括:
- [@zhanming](https://github.com/zhanming)
- themorecolor
- [@everyx](https://github.com/everyx)
- [@chidouhu](https://github.com/chidouhu)
- [@spawnris](https://github.com/spawnris)
- [@domainname](https://github.com/domainname)
- [@leisore](https://github.com/leisore)
## 适用人群
适合有一定编程基础,初学 Go 语言的爱好者。
@@ -19,4 +28,4 @@ Golang 编程245386165
|更新日期 |更新内容
|----------|------------------
|2015-08-25|10.8 垃圾回收和 SetFinalizer
|2015-09-8|11.1 接口是什么

4
TOC.md
View File

@@ -87,4 +87,6 @@
- 10.5 [匿名字段和内嵌结构体](eBook/10.5.md)
- 10.6 [方法](eBook/10.6.md)
- 10.7 [类型的 String() 方法和格式化描述符](eBook/10.7.md)
- 10.8 [垃圾回收和 SetFinalizer](eBook/10.8.md)
- 10.8 [垃圾回收和 SetFinalizer](eBook/10.8.md)
- 第11章[接口interface与反射reflection](eBook/11.0.md)
- 11.1 [接口是什么](eBook/11.1.md)

View File

@@ -7,7 +7,7 @@ Go 开发者不需要写代码来释放程序中不再使用的变量和结构
如果想知道当前的内存状态,可以使用:
```go
fmt.Printf(%d\n, runtime.MemStats.Alloc/1024)
fmt.Printf("%d\n", runtime.MemStats.Alloc/1024)
```
上面的程序会给出已分配内存的总量,单位是 Kb。进一步的测量参考 [文档页面](http://golang.org/pkg/runtime/#MemStatsType)。
@@ -30,4 +30,4 @@ runtime.SetFinalizer(obj, func(obj *typeObj))
- [目录](directory.md)
- 上一节:[类型的 String() 方法和格式化描述符](10.7.md)
- 下一章:[11 接口Interfaces与反射reflection](11.0.md)
- 下一章:[接口Interfaces与反射reflection](11.0.md)

View File

@@ -5,5 +5,5 @@
## 链接
- [目录](directory.md)
- 上一[垃圾回收和SetFinalizer](10.8.md)
- 上一[垃圾回收和SetFinalizer](10.8.md)
- 下一节:[接口是什么](11.1.md)

View File

@@ -18,17 +18,17 @@ type Namer interface {
上面的 `Namer` 是一个 **接口类型**
(按照约定,只包含一个方法的)接口的名字由方法名加 `[e]r` 后缀组成,例如 `Printer``Reader``Writer``Logger``Converter`等等。还有一些不常用的方式(当后缀`er`不合适时),比如`Recoverable`,此时接口名以`able`结尾,或者以 `I` 开头(像 `.NET``Java` 中那样)。
(按照约定,只包含一个方法的)接口的名字由方法名加 `[e]r` 后缀组成,例如 `Printer``Reader``Writer``Logger``Converter` 等等。还有一些不常用的方式(当后缀 `er` 不合适时),比如 `Recoverable`,此时接口名以 `able` 结尾,或者以 `I` 开头(像 `.NET``Java` 中那样)。
Go 语言中的接口都很简短,通常它们会包含0个、最多3个方法。
Go 语言中的接口都很简短,通常它们会包含 0 个、最多 3 个方法。
不像大多数面向对象编程语言,在 Go 语言中接口可以有值,一个接口类型的变量或一个 **接口值** `var ai Namer``ai`是一个多字multiword数据结构它的值是 `nil`。它本质上是一个指针,虽然不完全是一回事。指向接口值的指针是非法的,它们不仅一点用也没有,还会导致代码错误。
不像大多数面向对象编程语言,在 Go 语言中接口可以有值,一个接口类型的变量或一个 **接口值** `var ai Namer``ai` 是一个多字multiword数据结构它的值是 `nil`。它本质上是一个指针,虽然不完全是一回事。指向接口值的指针是非法的,它们不仅一点用也没有,还会导致代码错误。
![](images/11.1_fig11.1.jpg?raw=true)
此处的方法指针表是通过运行时反射能力构建的。
类型(比如结构体)实现接口方法集中的方法,每一个方法的实现说明了此方法是如何作用于该类型的:**即实现接口**,同时方法集也构成了该类型的接口。实现了 `Namer` 接口类型的变量可以赋值给 `ai` (接收者值),此时方法表中的指针会指向被实现的接口方法。当然如果另一个类型(也实现了该接口)的变量被赋值给`ai`,这二者(译者注:指针和方法实现)也会随之改变。
类型(比如结构体)实现接口方法集中的方法,每一个方法的实现说明了此方法是如何作用于该类型的:**即实现接口**,同时方法集也构成了该类型的接口。实现了 `Namer` 接口类型的变量可以赋值给 `ai` (接收者值),此时方法表中的指针会指向被实现的接口方法。当然如果另一个类型(也实现了该接口)的变量被赋值给 `ai`,这二者(译者注:指针和方法实现)也会随之改变。
**类型不需要显式声明它实现了某个接口:接口被隐式地实现。多个类型可以实现同一个接口**
@@ -83,7 +83,7 @@ func main() {
上面的程序定义了一个结构体 `Square` 和一个接口 `Shaper`,接口有一个方法 `Area()`
`main()` 方法中创建了一个 `Square` 的实例。在主程序外边定义了一个接收者类型是 `Square`方法的 `Area()`,用来计算正方形的面积:结构体 `Square` 实现了接口 `Shaper`
`main()` 方法中创建了一个 `Square` 的实例。在主程序外边定义了一个接收者类型是 `Square` 方法的 `Area()`,用来计算正方形的面积:结构体 `Square` 实现了接口 `Shaper`
所以可以将一个 `Square` 类型的变量赋值给一个接口类型的变量:`areaIntf = sq1`
@@ -154,7 +154,7 @@ func main() {
也许从现在开始你将看到通过接口如何产生 **更干净**、**更简单** 及 **更具有扩展性** 的代码。在 11.12.3 中将看到在开发中为类型添加新的接口是多么的容易。
下面是一个更具体的例子:有两个类型 `stockPosition``car`,它们都有一个 `getValue()` 方法,我们可以定义一个具有此方法的接口 `valuable`。接着定义一个使用 `valuable`类型作为参数的函数 `showValue()`,所有实现了 `valuable` 接口的类型都可以用这个函数。
下面是一个更具体的例子:有两个类型 `stockPosition``car`,它们都有一个 `getValue()` 方法,我们可以定义一个具有此方法的接口 `valuable`。接着定义一个使用 `valuable` 类型作为参数的函数 `showValue()`,所有实现了 `valuable` 接口的类型都可以用这个函数。
示例 11.3 valuable.go
@@ -209,7 +209,7 @@ func main() {
**一个标准库的例子**
`io`包里有一个接口类型 `Reader`:
`io` 包里有一个接口类型 `Reader`:
```go
type Reader interface {
@@ -252,5 +252,5 @@ b) 使用一个抽象类型 `Shape`(没有字段) 实现同样的功能,
- [目录](directory.md)
- 上一节:[接口Interfaces与反射reflection](11.0.md)
- 下一节:[接口嵌套接口](11.2.md)
- 下一节:[接口嵌套接口](11.2.md)