mirror of
https://github.com/unknwon/the-way-to-go_ZH_CN.git
synced 2025-08-12 04:48:29 +08:00
改正错别字及微调格式 (#782)
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
# 6.0 函数
|
# 6.0 函数(function)
|
||||||
|
|
||||||
函数是 Go 里面的基本代码块:Go 函数的功能非常强大,以至于被认为拥有函数式编程语言的多种特性。在这一章,我们将对 [第 4.2.2 节](04.2.md) 所简要描述的函数进行详细的讲解。
|
函数是 Go 里面的基本代码块:Go 函数的功能非常强大,以至于被认为拥有函数式编程语言的多种特性。在这一章,我们将对 [第 4.2.2 节](04.2.md) 所简要描述的函数进行详细的讲解。
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
# 10 结构(struct)与方法(method)
|
# 10.0 结构(struct)与方法(method)
|
||||||
|
|
||||||
Go 通过类型别名(alias types)和结构体的形式支持用户自定义类型,或者叫定制类型。一个带属性的结构体试图表示一个现实世界中的实体。结构体是复合类型(composite types),当需要定义一个类型,它由一系列属性组成,每个属性都有自己的类型和值的时候,就应该使用结构体,它把数据聚集在一起。然后可以访问这些数据,就好像它是一个独立实体的一部分。结构体也是值类型,因此可以通过 **new** 函数来创建。
|
Go 通过类型别名(alias types)和结构体的形式支持用户自定义类型,或者叫定制类型。一个带属性的结构体试图表示一个现实世界中的实体。结构体是复合类型(composite types),当需要定义一个类型,它由一系列属性组成,每个属性都有自己的类型和值的时候,就应该使用结构体,它把数据聚集在一起。然后可以访问这些数据,就好像它是一个独立实体的一部分。结构体也是值类型,因此可以通过 **new** 函数来创建。
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
# 11 接口(Interfaces)与反射(reflection)
|
# 11.0 接口(interface)与反射(reflection)
|
||||||
|
|
||||||
本章介绍 Go 语言中接口和反射的相关内容。
|
本章介绍 Go 语言中接口和反射的相关内容。
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
# 11.1 接口是什么
|
# 11.1 接口是什么
|
||||||
|
|
||||||
Go 语言不是一种 *“传统”* 的面向对象编程语言:它里面没有类和继承的概念。
|
Go 语言不是一种 *“传统”* 的面向对象编程语言:它里面没有类和继承的概念。
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
# 总结:Go 中的面向对象
|
# 11.13 总结:Go 中的面向对象
|
||||||
|
|
||||||
我们总结一下前面看到的:Go 没有类,而是松耦合的类型、方法对接口的实现。
|
我们总结一下前面看到的:Go 没有类,而是松耦合的类型、方法对接口的实现。
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
# 11.2 接口嵌套接口
|
# 11.2 接口嵌套接口
|
||||||
|
|
||||||
一个接口可以包含一个或多个其他的接口,这相当于直接将这些内嵌接口的方法列举在外层接口中一样。
|
一个接口可以包含一个或多个其他的接口,这相当于直接将这些内嵌接口的方法列举在外层接口中一样。
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
# 11.3 类型断言:如何检测和转换接口变量的类型
|
# 11.3 类型断言:如何检测和转换接口变量的类型
|
||||||
|
|
||||||
一个接口类型的变量 `varI` 中可以包含任何类型的值,必须有一种方式来检测它的 **动态** 类型,即运行时在变量中存储的值的实际类型。在执行过程中动态类型可能会有所不同,但是它总是可以分配给接口变量本身的类型。通常我们可以使用 **类型断言** 来测试在某个时刻 `varI` 是否包含类型 `T` 的值:
|
一个接口类型的变量 `varI` 中可以包含任何类型的值,必须有一种方式来检测它的 **动态** 类型,即运行时在变量中存储的值的实际类型。在执行过程中动态类型可能会有所不同,但是它总是可以分配给接口变量本身的类型。通常我们可以使用 **类型断言** 来测试在某个时刻 `varI` 是否包含类型 `T` 的值:
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
# 11.4 类型判断:type-switch
|
# 11.4 类型判断:type-switch
|
||||||
|
|
||||||
接口变量的类型也可以使用一种特殊形式的 `switch` 来检测:**type-switch** (下面是示例 11.4 的第二部分):
|
接口变量的类型也可以使用一种特殊形式的 `switch` 来检测:**type-switch** (下面是示例 11.4 的第二部分):
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
# 11.5 测试一个值是否实现了某个接口
|
# 11.5 测试一个值是否实现了某个接口
|
||||||
|
|
||||||
这是 11.3 类型断言中的一个特例:假定 `v` 是一个值,然后我们想测试它是否实现了 `Stringer` 接口,可以这样做:
|
这是 11.3 类型断言中的一个特例:假定 `v` 是一个值,然后我们想测试它是否实现了 `Stringer` 接口,可以这样做:
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
# 11.6 使用方法集与接口
|
# 11.6 使用方法集与接口
|
||||||
|
|
||||||
在第 10.6.3 节及例子 methodset1.go 中我们看到,作用于变量上的方法实际上是不区分变量到底是指针还是值的。当碰到接口类型值时,这会变得有点复杂,原因是接口变量中存储的具体值是不可寻址的,幸运的是,如果使用不当编译器会给出错误。考虑下面的程序:
|
在第 10.6.3 节及例子 methodset1.go 中我们看到,作用于变量上的方法实际上是不区分变量到底是指针还是值的。当碰到接口类型值时,这会变得有点复杂,原因是接口变量中存储的具体值是不可寻址的,幸运的是,如果使用不当编译器会给出错误。考虑下面的程序:
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
# 11.7 第一个例子:使用 Sorter 接口排序
|
# 11.7 第一个例子:使用 Sorter 接口排序
|
||||||
|
|
||||||
一个很好的例子是来自标准库的 `sort` 包,要对一组数字或字符串排序,只需要实现三个方法:反映元素个数的 `Len()`方法、比较第 `i` 和 `j` 个元素的 `Less(i, j)` 方法以及交换第 `i` 和 `j` 个元素的 `Swap(i, j)` 方法。
|
一个很好的例子是来自标准库的 `sort` 包,要对一组数字或字符串排序,只需要实现三个方法:反映元素个数的 `Len()`方法、比较第 `i` 和 `j` 个元素的 `Less(i, j)` 方法以及交换第 `i` 和 `j` 个元素的 `Swap(i, j)` 方法。
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
# 11.8 第二个例子:读和写
|
# 11.8 第二个例子:读和写
|
||||||
|
|
||||||
读和写是软件中很普遍的行为,提起它们会立即想到读写文件、缓存(比如字节或字符串切片)、标准输入输出、标准错误以及网络连接、管道等等,或者读写我们的自定义类型。为了让代码尽可能通用,Go 采取了一致的方式来读写数据。
|
读和写是软件中很普遍的行为,提起它们会立即想到读写文件、缓存(比如字节或字符串切片)、标准输入输出、标准错误以及网络连接、管道等等,或者读写我们的自定义类型。为了让代码尽可能通用,Go 采取了一致的方式来读写数据。
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
# 12 读写数据
|
# 12.0 读写数据
|
||||||
|
|
||||||
除了 fmt 和 os 包,我们还需要用到 bufio 包来处理缓冲的输入和输出。
|
除了 fmt 和 os 包,我们还需要用到 bufio 包来处理缓冲的输入和输出。
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
# 13 错误处理与测试
|
# 13.0 错误处理与测试
|
||||||
|
|
||||||
Go 没有像 Java 和 .NET 那样的 `try/catch` 异常机制:不能执行抛异常操作。但是有一套 `defer-panic-and-recover` 机制(参见 13.2-13.3 节)。
|
Go 没有像 Java 和 .NET 那样的 `try/catch` 异常机制:不能执行抛异常操作。但是有一套 `defer-panic-and-recover` 机制(参见 13.2-13.3 节)。
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
# 14 协程(goroutine)与通道(channel)
|
# 14.0 协程(goroutine)与通道(channel)
|
||||||
|
|
||||||
作为一门 21 世纪的语言,Go 原生支持应用之间的通信(网络,客户端和服务端,分布式计算,参见第 15 章)和程序的并发。程序可以在不同的处理器和计算机上同时执行不同的代码段。Go 语言为构建并发程序的基本代码块是 协程 (goroutine) 与通道 (channel)。他们需要语言,编译器,和runtime的支持。Go 语言提供的垃圾回收器对并发编程至关重要。
|
作为一门 21 世纪的语言,Go 原生支持应用之间的通信(网络,客户端和服务端,分布式计算,参见第 15 章)和程序的并发。程序可以在不同的处理器和计算机上同时执行不同的代码段。Go 语言为构建并发程序的基本代码块是 协程 (goroutine) 与通道 (channel)。他们需要语言,编译器,和runtime的支持。Go 语言提供的垃圾回收器对并发编程至关重要。
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
# 15.0 网络,模板和网页应用
|
# 15.0 网络、模板与网页应用
|
||||||
|
|
||||||
Go 在编写 web 应用方面非常得力。因为目前它还没有GUI(Graphic User Interface 即图形化用户界面)的框架,通过文本或者模板展现的 html 页面是目前 Go 编写界面应用程序的唯一方式。(**译者注:实际上在翻译的时候,已经有了一些不太成熟的GUI库例如:go ui。**)
|
Go 在编写 web 应用方面非常得力。因为目前它还没有GUI(Graphic User Interface 即图形化用户界面)的框架,通过文本或者模板展现的 html 页面是目前 Go 编写界面应用程序的唯一方式。(**译者注:实际上在翻译的时候,已经有了一些不太成熟的GUI库例如:go ui。**)
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
# 15.2 一个简单的网页服务器
|
# 15.2 一个简单的 web 服务器
|
||||||
|
|
||||||
http 是比 tcp 更高层的协议,它描述了网页服务器如何与客户端浏览器进行通信。Go 提供了 `net/http` 包,我们马上就来看下。先从一些简单的示例开始,首先编写一个“Hello world!”网页服务器:[查看示例15.6](examples/chapter_15/hello_world_webserver.go)
|
http 是比 tcp 更高层的协议,它描述了网页服务器如何与客户端浏览器进行通信。Go 提供了 `net/http` 包,我们马上就来看下。先从一些简单的示例开始,首先编写一个“Hello world!”网页服务器:[查看示例15.6](examples/chapter_15/hello_world_webserver.go)
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
# 15.3 访问并读取页面
|
# 15.3 访问并读取页面数据
|
||||||
|
|
||||||
在下边这个程序中,数组中的 url 都将被访问:会发送一个简单的 `http.Head()` 请求查看返回值;它的声明如下:`func Head(url string) (r *Response, err error)`
|
在下边这个程序中,数组中的 url 都将被访问:会发送一个简单的 `http.Head()` 请求查看返回值;它的声明如下:`func Head(url string) (r *Response, err error)`
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
# 16 常见的陷阱与错误
|
# 16.0 常见的陷阱与错误
|
||||||
|
|
||||||
在之前的内容中,有时候使用`!!...!!`标记警告go语言中的一些错误使用方式。当你在编程时候遇到的一个困难,可以确定本书特定的章节能找到类似的主题。为了方便起见,这里列出了一些常见陷阱,以便于你能发现更多的解释和例子:
|
在之前的内容中,有时候使用`!!...!!`标记警告go语言中的一些错误使用方式。当你在编程时候遇到的一个困难,可以确定本书特定的章节能找到类似的主题。为了方便起见,这里列出了一些常见陷阱,以便于你能发现更多的解释和例子:
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
# 16.3 发生错误时使用defer关闭一个文件
|
# 16.3 发生错误时使用 defer 关闭一个文件
|
||||||
|
|
||||||
如果你在一个for循环内部处理一系列文件,你需要使用defer确保文件在处理完毕后被关闭,例如:
|
如果你在一个for循环内部处理一系列文件,你需要使用defer确保文件在处理完毕后被关闭,例如:
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
# 16.4 何时使用new()和make()
|
# 16.4 何时使用 new() 和 make()
|
||||||
|
|
||||||
在第[7.2.1小节](07.2.md)和第[10.2.2](10.2.md)小节,我们已经讨论过此问题,并使用代码进行详细说明,观点如下:
|
在第[7.2.1小节](07.2.md)和第[10.2.2](10.2.md)小节,我们已经讨论过此问题,并使用代码进行详细说明,观点如下:
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
# 17 Go 语言模式
|
# 17.0 模式
|
||||||
|
|
||||||
## 链接
|
## 链接
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
# 18 出于性能考虑的实用代码片段
|
# 18.0 出于性能考虑的实用代码片段
|
||||||
|
|
||||||
## 链接
|
## 链接
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
# 19 构建一个完整的应用程序
|
# 19.0 构建一个完整的应用程序
|
||||||
|
|
||||||
## 链接
|
## 链接
|
||||||
|
|
||||||
|
@@ -120,7 +120,7 @@
|
|||||||
- 12.6 [用切片读写文件](12.6.md)
|
- 12.6 [用切片读写文件](12.6.md)
|
||||||
- 12.7 [用 defer 关闭文件](12.7.md)
|
- 12.7 [用 defer 关闭文件](12.7.md)
|
||||||
- 12.8 [使用接口的实际例子:fmt.Fprintf](12.8.md)
|
- 12.8 [使用接口的实际例子:fmt.Fprintf](12.8.md)
|
||||||
- 12.9 [格式化 JSON 数据](12.9.md)
|
- 12.9 [JSON 数据格式](12.9.md)
|
||||||
- 12.10 [XML 数据格式](12.10.md)
|
- 12.10 [XML 数据格式](12.10.md)
|
||||||
- 12.11 [用 Gob 传输数据](12.11.md)
|
- 12.11 [用 Gob 传输数据](12.11.md)
|
||||||
- 12.12 [Go 中的密码学](12.12.md)
|
- 12.12 [Go 中的密码学](12.12.md)
|
||||||
@@ -137,10 +137,10 @@
|
|||||||
- 13.10 [性能调试:分析并优化 Go 程序](13.10.md)
|
- 13.10 [性能调试:分析并优化 Go 程序](13.10.md)
|
||||||
- 第14章:[协程(goroutine)与通道(channel)](14.0.md)
|
- 第14章:[协程(goroutine)与通道(channel)](14.0.md)
|
||||||
- 14.1 [并发、并行和协程](14.1.md)
|
- 14.1 [并发、并行和协程](14.1.md)
|
||||||
- 14.2 [使用通道进行协程间通信](14.2.md)
|
- 14.2 [协程间的信道](14.2.md)
|
||||||
- 14.3 [协程同步:关闭通道-对阻塞的通道进行测试](14.3.md)
|
- 14.3 [协程的同步:关闭通道-测试阻塞的通道](14.3.md)
|
||||||
- 14.4 [使用 select 切换协程](14.4.md)
|
- 14.4 [使用 select 切换协程](14.4.md)
|
||||||
- 14.5 [通道,超时和计时器(Ticker)](14.5.md)
|
- 14.5 [通道、超时和计时器(Ticker)](14.5.md)
|
||||||
- 14.6 [协程和恢复(recover)](14.6.md)
|
- 14.6 [协程和恢复(recover)](14.6.md)
|
||||||
- 14.7 [新旧模型对比:任务和worker](14.7.md)
|
- 14.7 [新旧模型对比:任务和worker](14.7.md)
|
||||||
- 14.8 [惰性生成器的实现](14.8.md)
|
- 14.8 [惰性生成器的实现](14.8.md)
|
||||||
@@ -153,9 +153,9 @@
|
|||||||
- 14.15 [漏桶算法](14.15.md)
|
- 14.15 [漏桶算法](14.15.md)
|
||||||
- 14.16 [对Go协程进行基准测试](14.16.md)
|
- 14.16 [对Go协程进行基准测试](14.16.md)
|
||||||
- 14.17 [使用通道并发访问对象](14.17.md)
|
- 14.17 [使用通道并发访问对象](14.17.md)
|
||||||
- 第15章:[网络、模版与网页应用](15.0.md)
|
- 第15章:[网络、模板与网页应用](15.0.md)
|
||||||
- 15.1 [tcp服务器](15.1.md)
|
- 15.1 [tcp 服务器](15.1.md)
|
||||||
- 15.2 [一个简单的web服务器](15.2.md)
|
- 15.2 [一个简单的 web 服务器](15.2.md)
|
||||||
- 15.3 [访问并读取页面数据](15.3.md)
|
- 15.3 [访问并读取页面数据](15.3.md)
|
||||||
- 15.4 [写一个简单的网页应用](15.4.md)
|
- 15.4 [写一个简单的网页应用](15.4.md)
|
||||||
- 15.5 [确保网页应用健壮](15.5.md)
|
- 15.5 [确保网页应用健壮](15.5.md)
|
||||||
@@ -172,8 +172,8 @@
|
|||||||
- 第16章:[常见的陷阱与错误](16.0.md)
|
- 第16章:[常见的陷阱与错误](16.0.md)
|
||||||
- 16.1 [误用短声明导致变量覆盖](16.1.md)
|
- 16.1 [误用短声明导致变量覆盖](16.1.md)
|
||||||
- 16.2 [误用字符串](16.2.md)
|
- 16.2 [误用字符串](16.2.md)
|
||||||
- 16.3 [发生错误时使用defer关闭一个文件](16.3.md)
|
- 16.3 [发生错误时使用 defer 关闭一个文件](16.3.md)
|
||||||
- 16.4 [何时使用new()和make()](16.4.md)
|
- 16.4 [何时使用 new() 和 make()](16.4.md)
|
||||||
- 16.5 [不需要将一个指向切片的指针传递给函数](16.5.md)
|
- 16.5 [不需要将一个指向切片的指针传递给函数](16.5.md)
|
||||||
- 16.6 [使用指针指向接口类型](16.6.md)
|
- 16.6 [使用指针指向接口类型](16.6.md)
|
||||||
- 16.7 [使用值类型时误用指针](16.7.md)
|
- 16.7 [使用值类型时误用指针](16.7.md)
|
||||||
@@ -181,7 +181,7 @@
|
|||||||
- 16.9 [闭包和协程的使用](16.9.md)
|
- 16.9 [闭包和协程的使用](16.9.md)
|
||||||
- 16.10 [糟糕的错误处理](16.10.md)
|
- 16.10 [糟糕的错误处理](16.10.md)
|
||||||
- 第17章:[模式](17.0.md)
|
- 第17章:[模式](17.0.md)
|
||||||
- 17.1 [逗号ok模式](17.1.md)
|
- 17.1 [逗号 ok 模式](17.1.md)
|
||||||
- 17.2 [defer 模式](17.2.md)
|
- 17.2 [defer 模式](17.2.md)
|
||||||
- 17.3 [可见性模式](17.3.md)
|
- 17.3 [可见性模式](17.3.md)
|
||||||
- 17.4 [运算符模式和接口](17.4.md)
|
- 17.4 [运算符模式和接口](17.4.md)
|
||||||
@@ -197,7 +197,7 @@
|
|||||||
- 18.9 [网络和网页应用](18.9.md)
|
- 18.9 [网络和网页应用](18.9.md)
|
||||||
- 18.10 [其他](18.10.md)
|
- 18.10 [其他](18.10.md)
|
||||||
- 18.11 [出于性能考虑的最佳实践和建议](18.11.md)
|
- 18.11 [出于性能考虑的最佳实践和建议](18.11.md)
|
||||||
- 第19章:构建一个完整的应用程序
|
- 第19章:[构建一个完整的应用程序](19.0.md)
|
||||||
- 19.1 [简介](19.1.md)
|
- 19.1 [简介](19.1.md)
|
||||||
- 19.2 [短网址项目简介](19.2.md)
|
- 19.2 [短网址项目简介](19.2.md)
|
||||||
- 19.3 [数据结构](19.3.md)
|
- 19.3 [数据结构](19.3.md)
|
||||||
|
Reference in New Issue
Block a user