- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
附录A:原文勘误
p.9, ¶2: for "can compared", read "can be compared". (Thanks to Antonio Macías Ojeda, 2015-10-22. Corrected in the second printing.)
diff --git a/appendix/appendix-b-author.html b/appendix/appendix-b-author.html index 8fb0e65..fca0319 100644 --- a/appendix/appendix-b-author.html +++ b/appendix/appendix-b-author.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
附录B:作者/译者
英文作者
diff --git a/appendix/appendix-c-cpoyright.html b/appendix/appendix-c-cpoyright.html index fb18549..62ffa28 100644 --- a/appendix/appendix-c-cpoyright.html +++ b/appendix/appendix-c-cpoyright.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
附录C:译文授权
除特别注明外,本站内容均采用知识共享-署名(CC-BY) 3.0协议授权,代码遵循Go项目的BSD协议授权。
diff --git a/appendix/appendix-d-translations.html b/appendix/appendix-d-translations.html index c96ec43..b51de2b 100644 --- a/appendix/appendix-d-translations.html +++ b/appendix/appendix-d-translations.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
附录D:其它语言
下表是 The Go Programming Language 其它语言版本:
diff --git a/appendix/appendix.html b/appendix/appendix.html index a90c4fb..92a0446 100644 --- a/appendix/appendix.html +++ b/appendix/appendix.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
附录
英文原版并没有包含附录部分,只有一个索引部分。中文版增加附录部分主要用于收录一些和本书相关的内容,比如英文原版的勘误(有些读者可能会对照中文和英文原阅读)、英文作者和中文译者、译文授权等内容。以后还可能会考虑增加一些习题解答相关的内容。
diff --git a/ch1/ch1-01.html b/ch1/ch1-01.html index db7de0c..85bc2f3 100644 --- a/ch1/ch1-01.html +++ b/ch1/ch1-01.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
1.1. Hello, World
我们以现已成为传统的“hello world”案例来开始吧,这个例子首次出现于 1978 年出版的 C 语言圣经 《The C Programming Language》(译注:本书作者之一 Brian W. Kernighan 也是《The C Programming Language》一书的作者)。C 语言是直接影响 Go 语言设计的语言之一。这个例子体现了 Go 语言一些核心理念。
diff --git a/ch1/ch1-02.html b/ch1/ch1-02.html index 49bd7f7..0812341 100644 --- a/ch1/ch1-02.html +++ b/ch1/ch1-02.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
1.2. 命令行参数
大多数的程序都是处理输入,产生输出;这也正是“计算”的定义。但是,程序如何获取要处理的输入数据呢?一些程序生成自己的数据,但通常情况下,输入来自于程序外部:文件、网络连接、其它程序的输出、敲键盘的用户、命令行参数或其它类似输入源。下面几个例子会讨论其中几个输入源,首先是命令行参数。
diff --git a/ch1/ch1-03.html b/ch1/ch1-03.html index 895a14d..26d41cf 100644 --- a/ch1/ch1-03.html +++ b/ch1/ch1-03.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
1.3. 查找重复的行
对文件做拷贝、打印、搜索、排序、统计或类似事情的程序都有一个差不多的程序结构:一个处理输入的循环,在每个元素上执行计算处理,在处理的同时或最后产生输出。我们会展示一个名为 dup
的程序的三个版本;灵感来自于 Unix 的 uniq
命令,其寻找相邻的重复行。该程序使用的结构和包是个参考范例,可以方便地修改。
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
1.4. GIF动画
下面的程序会演示Go语言标准库里的image这个package的用法,我们会用这个包来生成一系列的bit-mapped图,然后将这些图片编码为一个GIF动画。我们生成的图形名字叫利萨如图形(Lissajous figures),这种效果是在1960年代的老电影里出现的一种视觉特效。它们是协振子在两个纬度上振动所产生的曲线,比如两个sin正弦波分别在x轴和y轴输入会产生的曲线。图1.1是这样的一个例子:
diff --git a/ch1/ch1-05.html b/ch1/ch1-05.html index b5c52af..f90f5f9 100644 --- a/ch1/ch1-05.html +++ b/ch1/ch1-05.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
1.5. 获取URL
对于很多现代应用来说,访问互联网上的信息和访问本地文件系统一样重要。Go语言在net这个强大package的帮助下提供了一系列的package来做这件事情,使用这些包可以更简单地用网络收发信息,还可以建立更底层的网络连接,编写服务器程序。在这些情景下,Go语言原生的并发特性(在第八章中会介绍)显得尤其好用。
diff --git a/ch1/ch1-06.html b/ch1/ch1-06.html index 61b3a98..a4e8359 100644 --- a/ch1/ch1-06.html +++ b/ch1/ch1-06.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
1.6. 并发获取多个URL
Go语言最有意思并且最新奇的特性就是对并发编程的支持。并发编程是一个大话题,在第八章和第九章中会专门讲到。这里我们只浅尝辄止地来体验一下Go语言里的goroutine和channel。
diff --git a/ch1/ch1-07.html b/ch1/ch1-07.html index df296ae..bf55b08 100644 --- a/ch1/ch1-07.html +++ b/ch1/ch1-07.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
1.7. Web服务
Go语言的内置库使得写一个类似fetch的web服务器变得异常地简单。在本节中,我们会展示一个微型服务器,这个服务器的功能是返回当前用户正在访问的URL。比如用户访问的是 http://localhost:8000/hello ,那么响应是URL.Path = "hello"。
diff --git a/ch1/ch1-08.html b/ch1/ch1-08.html index bfcb3b1..08ee571 100644 --- a/ch1/ch1-08.html +++ b/ch1/ch1-08.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
1.8. 本章要点
本章对Go语言做了一些介绍,Go语言很多方面在有限的篇幅中无法覆盖到。本节会把没有讲到的内容也做一些简单的介绍,这样读者在读到完整的内容之前,可以有个简单的印象。
diff --git a/ch1/ch1.html b/ch1/ch1.html index 233325c..9e29796 100644 --- a/ch1/ch1.html +++ b/ch1/ch1.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
第1章 入门
本章介绍Go语言的基础组件。本章提供了足够的信息和示例程序,希望可以帮你尽快入门,写出有用的程序。本章和之后章节的示例程序都针对你可能遇到的现实案例。先了解几个Go程序,涉及的主题从简单的文件处理、图像处理到互联网客户端和服务端并发。当然,第一章不会解释细枝末节,但用这些程序来学习一门新语言还是很有效的。
diff --git a/ch10/ch10-01.html b/ch10/ch10-01.html index 4adaf38..25098fb 100644 --- a/ch10/ch10-01.html +++ b/ch10/ch10-01.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
10.1. 包简介
任何包系统设计的目的都是为了简化大型程序的设计和维护工作,通过将一组相关的特性放进一个独立的单元以便于理解和更新,在每个单元更新的同时保持和程序中其它单元的相对独立性。这种模块化的特性允许每个包可以被其它的不同项目共享和重用,在项目范围内、甚至全球范围统一的分发和复用。
diff --git a/ch10/ch10-02.html b/ch10/ch10-02.html index 35fb150..e24936c 100644 --- a/ch10/ch10-02.html +++ b/ch10/ch10-02.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
10.2. 导入路径
每个包是由一个全局唯一的字符串所标识的导入路径定位。出现在import语句中的导入路径也是字符串。
diff --git a/ch10/ch10-03.html b/ch10/ch10-03.html index ee0ba5c..0d80bf1 100644 --- a/ch10/ch10-03.html +++ b/ch10/ch10-03.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
10.3. 包声明
在每个Go语言源文件的开头都必须有包声明语句。包声明语句的主要目的是确定当前包被其它包导入时默认的标识符(也称为包名)。
diff --git a/ch10/ch10-04.html b/ch10/ch10-04.html index 939d1e7..d9d5504 100644 --- a/ch10/ch10-04.html +++ b/ch10/ch10-04.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
10.4. 导入声明
可以在一个Go语言源文件包声明语句之后,其它非导入声明语句之前,包含零到多个导入包声明语句。每个导入声明可以单独指定一个导入路径,也可以通过圆括号同时导入多个导入路径。下面两个导入形式是等价的,但是第二种形式更为常见。
diff --git a/ch10/ch10-05.html b/ch10/ch10-05.html index 6f86c80..d2a7433 100644 --- a/ch10/ch10-05.html +++ b/ch10/ch10-05.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
10.5. 包的匿名导入
如果只是导入一个包而并不使用导入的包将会导致一个编译错误。但是有时候我们只是想利用导入包而产生的副作用:它会计算包级变量的初始化表达式和执行导入包的init初始化函数(§2.6.2)。这时候我们需要抑制“unused import”编译错误,我们可以用下划线_
来重命名导入的包。像往常一样,下划线_
为空白标识符,并不能被访问。
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
10.6. 包和命名
在本节中,我们将提供一些关于Go语言独特的包和成员命名的约定。
diff --git a/ch10/ch10-07.html b/ch10/ch10-07.html index 3e208c9..fe875da 100644 --- a/ch10/ch10-07.html +++ b/ch10/ch10-07.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
10.7. 工具
本章剩下的部分将讨论Go语言工具箱的具体功能,包括如何下载、格式化、构建、测试和安装Go语言编写的程序。
diff --git a/ch10/ch10.html b/ch10/ch10.html index fb78fdc..713ad2a 100644 --- a/ch10/ch10.html +++ b/ch10/ch10.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
第10章 包和工具
现在随便一个小程序的实现都可能包含超过10000个函数。然而作者一般只需要考虑其中很小的一部分和做很少的设计,因为绝大部分代码都是由他人编写的,它们通过类似包或模块的方式被重用。
diff --git a/ch11/ch11-01.html b/ch11/ch11-01.html index 2a8da2b..13ad18f 100644 --- a/ch11/ch11-01.html +++ b/ch11/ch11-01.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
11.1. go test
go test命令是一个按照一定的约定和组织来测试代码的程序。在包目录内,所有以_test.go
为后缀名的源文件在执行go build时不会被构建成包的一部分,它们是go test测试的一部分。
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
11.2. 测试函数
每个测试函数必须导入testing包。测试函数有如下的签名:
diff --git a/ch11/ch11-03.html b/ch11/ch11-03.html index 24b5715..343e4d4 100644 --- a/ch11/ch11-03.html +++ b/ch11/ch11-03.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
11.3. 测试覆盖率
就其性质而言,测试不可能是完整的。计算机科学家Edsger Dijkstra曾说过:“测试能证明缺陷存在,而无法证明没有缺陷。”再多的测试也不能证明一个程序没有BUG。在最好的情况下,测试可以增强我们的信心:代码在很多重要场景下是可以正常工作的。
diff --git a/ch11/ch11-04.html b/ch11/ch11-04.html index bf80b7c..711a49f 100644 --- a/ch11/ch11-04.html +++ b/ch11/ch11-04.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
11.4. 基准测试
基准测试是测量一个程序在固定工作负载下的性能。在Go语言中,基准测试函数和普通测试函数写法类似,但是以Benchmark为前缀名,并且带有一个*testing.B
类型的参数;*testing.B
参数除了提供和*testing.T
类似的方法,还有额外一些和性能测量相关的方法。它还提供了一个整数N,用于指定操作执行的循环次数。
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
11.5. 剖析
基准测试(Benchmark)对于衡量特定操作的性能是有帮助的,但是当我们试图让程序跑的更快的时候,我们通常并不知道从哪里开始优化。每个码农都应该知道Donald Knuth在1974年的“Structured Programming with go to Statements”上所说的格言。虽然经常被解读为不重视性能的意思,但是从原文我们可以看到不同的含义:
diff --git a/ch11/ch11-06.html b/ch11/ch11-06.html index 85aa54c..ff74d71 100644 --- a/ch11/ch11-06.html +++ b/ch11/ch11-06.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
11.6. 示例函数
第三种被go test
特别对待的函数是示例函数,以Example为函数名开头。示例函数没有函数参数和返回值。下面是IsPalindrome函数对应的示例函数:
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
第11章 测试
Maurice Wilkes,第一个存储程序计算机EDSAC的设计者,1949年他在实验室爬楼梯时有一个顿悟。在《计算机先驱回忆录》(Memoirs of a Computer Pioneer)里,他回忆到:“忽然间有一种醍醐灌顶的感觉,我整个后半生的美好时光都将在寻找程序BUG中度过了”。肯定从那之后的大部分正常的码农都会同情Wilkes过分悲观的想法,虽然也许会有人困惑于他对软件开发的难度的天真看法。
diff --git a/ch12/ch12-01.html b/ch12/ch12-01.html index 83ff19d..d0f7159 100644 --- a/ch12/ch12-01.html +++ b/ch12/ch12-01.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
12.1. 为何需要反射?
有时候我们需要编写一个函数能够处理一类并不满足普通公共接口的类型的值,也可能是因为它们并没有确定的表示方式,或者是在我们设计该函数的时候这些类型可能还不存在。
diff --git a/ch12/ch12-02.html b/ch12/ch12-02.html index efe4526..21ffd36 100644 --- a/ch12/ch12-02.html +++ b/ch12/ch12-02.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
12.2. reflect.Type 和 reflect.Value
反射是由 reflect 包提供的。它定义了两个重要的类型,Type 和 Value。一个 Type 表示一个Go类型。它是一个接口,有许多方法来区分类型以及检查它们的组成部分,例如一个结构体的成员或一个函数的参数等。唯一能反映 reflect.Type 实现的是接口的类型描述信息(§7.5),也正是这个实体标识了接口值的动态类型。
diff --git a/ch12/ch12-03.html b/ch12/ch12-03.html index 583776c..ec05be4 100644 --- a/ch12/ch12-03.html +++ b/ch12/ch12-03.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
12.3. Display,一个递归的值打印器
接下来,让我们看看如何改善聚合数据类型的显示。我们并不想完全克隆一个fmt.Sprint函数,我们只是构建一个用于调试用的Display函数:给定任意一个复杂类型 x,打印这个值对应的完整结构,同时标记每个元素的发现路径。让我们从一个例子开始。
diff --git a/ch12/ch12-04.html b/ch12/ch12-04.html index 6572cdf..54540d7 100644 --- a/ch12/ch12-04.html +++ b/ch12/ch12-04.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
12.4. 示例: 编码为S表达式
Display是一个用于显示结构化数据的调试工具,但是它并不能将任意的Go语言对象编码为通用消息然后用于进程间通信。
diff --git a/ch12/ch12-05.html b/ch12/ch12-05.html index fbb4283..e2eac11 100644 --- a/ch12/ch12-05.html +++ b/ch12/ch12-05.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
12.5. 通过reflect.Value修改值
到目前为止,反射还只是程序中变量的另一种读取方式。然而,在本节中我们将重点讨论如何通过反射机制来修改变量。
diff --git a/ch12/ch12-06.html b/ch12/ch12-06.html index 9a345ec..fe922c5 100644 --- a/ch12/ch12-06.html +++ b/ch12/ch12-06.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
12.6. 示例: 解码S表达式
标准库中encoding/...下每个包中提供的Marshal编码函数都有一个对应的Unmarshal函数用于解码。例如,我们在4.5节中看到的,要将包含JSON编码格式的字节slice数据解码为我们自己的Movie类型(§12.3),我们可以这样做:
diff --git a/ch12/ch12-07.html b/ch12/ch12-07.html index 3e55dfa..22bf017 100644 --- a/ch12/ch12-07.html +++ b/ch12/ch12-07.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
12.7. 获取结构体字段标签
在4.5节我们使用构体成员标签用于设置对应JSON对应的名字。其中json成员标签让我们可以选择成员的名字和抑制零值成员的输出。在本节,我们将看到如何通过反射机制类获取成员标签。
diff --git a/ch12/ch12-08.html b/ch12/ch12-08.html index aa359e7..3b3221d 100644 --- a/ch12/ch12-08.html +++ b/ch12/ch12-08.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
12.8. 显示一个类型的方法集
我们的最后一个例子是使用reflect.Type来打印任意值的类型和枚举它的方法:
diff --git a/ch12/ch12-09.html b/ch12/ch12-09.html index 0fe457b..35b5119 100644 --- a/ch12/ch12-09.html +++ b/ch12/ch12-09.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
12.9. 几点忠告
虽然反射提供的API远多于我们讲到的,我们前面的例子主要是给出了一个方向,通过反射可以实现哪些功能。反射是一个强大并富有表达力的工具,但是它应该被小心地使用,原因有三。
diff --git a/ch12/ch12.html b/ch12/ch12.html index c00883b..54833ea 100644 --- a/ch12/ch12.html +++ b/ch12/ch12.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
第12章 反射
Go语言提供了一种机制,能够在运行时更新变量和检查它们的值、调用它们的方法和它们支持的内在操作,而不需要在编译时就知道这些变量的具体类型。这种机制被称为反射。反射也可以让我们将类型本身作为第一类的值类型处理。
diff --git a/ch13/ch13-01.html b/ch13/ch13-01.html index 139b7a7..c93523a 100644 --- a/ch13/ch13-01.html +++ b/ch13/ch13-01.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
13.1. unsafe.Sizeof, Alignof 和 Offsetof
unsafe.Sizeof函数返回操作数在内存中的字节大小,参数可以是任意类型的表达式,但是它并不会对表达式进行求值。一个Sizeof函数调用是一个对应uintptr类型的常量表达式,因此返回的结果可以用作数组类型的长度大小,或者用作计算其他的常量。
diff --git a/ch13/ch13-02.html b/ch13/ch13-02.html index 55f3dff..cccb62a 100644 --- a/ch13/ch13-02.html +++ b/ch13/ch13-02.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
13.2. unsafe.Pointer
大多数指针类型会写成*T
,表示是“一个指向T类型变量的指针”。unsafe.Pointer是特别定义的一种指针类型(译注:类似C语言中的void*
类型的指针),它可以包含任意类型变量的地址。当然,我们不可以直接通过*p
来获取unsafe.Pointer指针指向的真实变量的值,因为我们并不知道变量的具体类型。和普通指针一样,unsafe.Pointer指针也是可以比较的,并且支持和nil常量比较判断是否为空指针。
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
13.3. 示例: 深度相等判断
来自reflect包的DeepEqual函数可以对两个值进行深度相等判断。DeepEqual函数使用内建的==比较操作符对基础类型进行相等判断,对于复合类型则递归该变量的每个基础类型然后做类似的比较判断。因为它可以工作在任意的类型上,甚至对于一些不支持==操作运算符的类型也可以工作,因此在一些测试代码中广泛地使用该函数。比如下面的代码是用DeepEqual函数比较两个字符串slice是否相等。
diff --git a/ch13/ch13-04.html b/ch13/ch13-04.html index 5eb5bea..1985f68 100644 --- a/ch13/ch13-04.html +++ b/ch13/ch13-04.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
13.4. 通过cgo调用C代码
Go程序可能会遇到要访问C语言的某些硬件驱动函数的场景,或者是从一个C++语言实现的嵌入式数据库查询记录的场景,或者是使用Fortran语言实现的一些线性代数库的场景。C语言作为一个通用语言,很多库会选择提供一个C兼容的API,然后用其他不同的编程语言实现(译者:Go语言需要也应该拥抱这些巨大的代码遗产)。
diff --git a/ch13/ch13-05.html b/ch13/ch13-05.html index e720047..d17c6f8 100644 --- a/ch13/ch13-05.html +++ b/ch13/ch13-05.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
13.5. 几点忠告
我们在前一章结尾的时候,我们警告要谨慎使用reflect包。那些警告同样适用于本章的unsafe包。
diff --git a/ch13/ch13.html b/ch13/ch13.html index 99e4bba..7616cc9 100644 --- a/ch13/ch13.html +++ b/ch13/ch13.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
第13章 底层编程
Go语言的设计包含了诸多安全策略,限制了可能导致程序运行出错的用法。编译时类型检查可以发现大多数类型不匹配的操作,例如两个字符串做减法的错误。字符串、map、slice和chan等所有的内置类型,都有严格的类型转换规则。
diff --git a/ch2/ch2-01.html b/ch2/ch2-01.html index 42fee24..aec16fd 100644 --- a/ch2/ch2-01.html +++ b/ch2/ch2-01.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
2.1. 命名
Go语言中的函数名、变量名、常量名、类型名、语句标号和包名等所有的命名,都遵循一个简单的命名规则:一个名字必须以一个字母(Unicode字母)或下划线开头,后面可以跟任意数量的字母、数字或下划线。大写字母和小写字母是不同的:heapSort和Heapsort是两个不同的名字。
diff --git a/ch2/ch2-02.html b/ch2/ch2-02.html index 91e2581..993807c 100644 --- a/ch2/ch2-02.html +++ b/ch2/ch2-02.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
2.2. 声明
声明语句定义了程序的各种实体对象以及部分或全部的属性。Go语言主要有四种类型的声明语句:var、const、type和func,分别对应变量、常量、类型和函数实体对象的声明。这一章我们重点讨论变量和类型的声明,第三章将讨论常量的声明,第五章将讨论函数的声明。
diff --git a/ch2/ch2-03.html b/ch2/ch2-03.html index 5fd7b09..5e16bce 100644 --- a/ch2/ch2-03.html +++ b/ch2/ch2-03.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
2.3. 变量
var声明语句可以创建一个特定类型的变量,然后给变量附加一个名字,并且设置变量的初始值。变量声明的一般语法如下:
diff --git a/ch2/ch2-04.html b/ch2/ch2-04.html index 9370e6f..bcd0036 100644 --- a/ch2/ch2-04.html +++ b/ch2/ch2-04.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
2.4. 赋值
使用赋值语句可以更新一个变量的值,最简单的赋值语句是将要被赋值的变量放在=的左边,新值的表达式放在=的右边。
diff --git a/ch2/ch2-05.html b/ch2/ch2-05.html index c6b01bc..2bbbcac 100644 --- a/ch2/ch2-05.html +++ b/ch2/ch2-05.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
2.5. 类型
变量或表达式的类型定义了对应存储值的属性特征,例如数值在内存的存储大小(或者是元素的bit个数),它们在内部是如何表达的,是否支持一些操作符,以及它们自己关联的方法集等。
diff --git a/ch2/ch2-06.html b/ch2/ch2-06.html index 8070ba4..7e013e6 100644 --- a/ch2/ch2-06.html +++ b/ch2/ch2-06.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
2.6. 包和文件
Go语言中的包和其他语言的库或模块的概念类似,目的都是为了支持模块化、封装、单独编译和代码重用。一个包的源代码保存在一个或多个以.go为文件后缀名的源文件中,通常一个包所在目录路径的后缀是包的导入路径;例如包gopl.io/ch1/helloworld对应的目录路径是$GOPATH/src/gopl.io/ch1/helloworld。
diff --git a/ch2/ch2-07.html b/ch2/ch2-07.html index f7f7b6d..5577e96 100644 --- a/ch2/ch2-07.html +++ b/ch2/ch2-07.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
2.7. 作用域
一个声明语句将程序中的实体和一个名字关联,比如一个函数或一个变量。声明语句的作用域是指源代码中可以有效使用这个名字的范围。
diff --git a/ch2/ch2.html b/ch2/ch2.html index acdb6e1..69024da 100644 --- a/ch2/ch2.html +++ b/ch2/ch2.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
第2章 程序结构
Go语言和其他编程语言一样,一个大的程序是由很多小的基础构件组成的。变量保存值,简单的加法和减法运算被组合成较复杂的表达式。基础类型被聚合为数组或结构体等更复杂的数据结构。然后使用if和for之类的控制语句来组织和控制表达式的执行流程。然后多个语句被组织到一个个函数中,以便代码的隔离和复用。函数以源文件和包的方式被组织。
diff --git a/ch3/ch3-01.html b/ch3/ch3-01.html index 656ec27..92b4bf7 100644 --- a/ch3/ch3-01.html +++ b/ch3/ch3-01.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
3.1. 整型
Go语言的数值类型包括几种不同大小的整数、浮点数和复数。每种数值类型都决定了对应的大小范围和是否支持正负符号。让我们先从整数类型开始介绍。
diff --git a/ch3/ch3-02.html b/ch3/ch3-02.html index 4472fc9..45c1ab4 100644 --- a/ch3/ch3-02.html +++ b/ch3/ch3-02.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
3.2. 浮点数
Go语言提供了两种精度的浮点数,float32和float64。它们的算术规范由IEEE754浮点数国际标准定义,该浮点数规范被所有现代的CPU支持。
diff --git a/ch3/ch3-03.html b/ch3/ch3-03.html index fcf4557..7b1a4f5 100644 --- a/ch3/ch3-03.html +++ b/ch3/ch3-03.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
3.3. 复数
Go语言提供了两种精度的复数类型:complex64和complex128,分别对应float32和float64两种浮点数精度。内置的complex函数用于构建复数,内建的real和imag函数分别返回复数的实部和虚部:
diff --git a/ch3/ch3-04.html b/ch3/ch3-04.html index 10b588a..4523bf5 100644 --- a/ch3/ch3-04.html +++ b/ch3/ch3-04.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
3.4. 布尔型
一个布尔类型的值只有两种:true和false。if和for语句的条件部分都是布尔类型的值,并且==和<等比较操作也会产生布尔型的值。一元操作符!
对应逻辑非操作,因此!true
的值为false
,更罗嗦的说法是(!true==false)==true
,虽然表达方式不一样,不过我们一般会采用简洁的布尔表达式,就像用x来表示x==true
。
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
3.5. 字符串
一个字符串是一个不可改变的字节序列。字符串可以包含任意的数据,包括byte值0,但是通常是用来包含人类可读的文本。文本字符串通常被解释为采用UTF8编码的Unicode码点(rune)序列,我们稍后会详细讨论这个问题。
diff --git a/ch3/ch3-06.html b/ch3/ch3-06.html index 21d6575..8525d91 100644 --- a/ch3/ch3-06.html +++ b/ch3/ch3-06.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
3.6. 常量
常量表达式的值在编译期计算,而不是在运行期。每种常量的潜在类型都是基础类型:boolean、string或数字。
diff --git a/ch3/ch3.html b/ch3/ch3.html index aafeb29..a08933c 100644 --- a/ch3/ch3.html +++ b/ch3/ch3.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
第3章 基础数据类型
虽然从底层而言,所有的数据都是由比特组成,但计算机一般操作的是固定大小的字,如整数、浮点数、比特数组、内存地址等。进一步将这些数组织在一起,就可表达更多的对象,例如数据包、像素点、诗歌,甚至其他任何对象。Go语言提供了丰富的数据组织形式,这依赖于Go语言内置的数据类型。这些内置的数据类型,兼顾了硬件的特性和表达复杂数据结构的便捷性。
diff --git a/ch4/ch4-01.html b/ch4/ch4-01.html index d463c0c..2f76f08 100644 --- a/ch4/ch4-01.html +++ b/ch4/ch4-01.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
4.1. 数组
数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。因为数组的长度是固定的,因此在Go语言中很少直接使用数组。和数组对应的类型是Slice(切片),它是可以增长和收缩的动态序列,slice功能也更灵活,但是要理解slice工作原理的话需要先理解数组。
diff --git a/ch4/ch4-02.html b/ch4/ch4-02.html index 21df6d1..1f2b0e4 100644 --- a/ch4/ch4-02.html +++ b/ch4/ch4-02.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
4.2. Slice
Slice(切片)代表变长的序列,序列中每个元素都有相同的类型。一个slice类型一般写作[]T,其中T代表slice中元素的类型;slice的语法和数组很像,只是没有固定长度而已。
diff --git a/ch4/ch4-03.html b/ch4/ch4-03.html index 4a149d3..6522d1e 100644 --- a/ch4/ch4-03.html +++ b/ch4/ch4-03.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
4.3. Map
哈希表是一种巧妙并且实用的数据结构。它是一个无序的key/value对的集合,其中所有的key都是不同的,然后通过给定的key可以在常数时间复杂度内检索、更新或删除对应的value。
diff --git a/ch4/ch4-04.html b/ch4/ch4-04.html index b01834f..fa5dbb9 100644 --- a/ch4/ch4-04.html +++ b/ch4/ch4-04.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
4.4. 结构体
结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体。每个值称为结构体的成员。用结构体的经典案例是处理公司的员工信息,每个员工信息包含一个唯一的员工编号、员工的名字、家庭住址、出生日期、工作岗位、薪资、上级领导等等。所有的这些信息都需要绑定到一个实体中,可以作为一个整体单元被复制,作为函数的参数或返回值,或者是被存储到数组中,等等。
diff --git a/ch4/ch4-05.html b/ch4/ch4-05.html index 8196c52..afe427e 100644 --- a/ch4/ch4-05.html +++ b/ch4/ch4-05.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
4.5. JSON
JavaScript对象表示法(JSON)是一种用于发送和接收结构化信息的标准协议。在类似的协议中,JSON并不是唯一的一个标准协议。 XML(§7.14)、ASN.1和Google的Protocol Buffers都是类似的协议,并且有各自的特色,但是由于简洁性、可读性和流行程度等原因,JSON是应用最广泛的一个。
diff --git a/ch4/ch4-06.html b/ch4/ch4-06.html index 86d3339..7b32f0a 100644 --- a/ch4/ch4-06.html +++ b/ch4/ch4-06.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
4.6. 文本和HTML模板
前面的例子,只是最简单的格式化,使用Printf是完全足够的。但是有时候会需要复杂的打印格式,这时候一般需要将格式化代码分离出来以便更安全地修改。这些功能是由text/template和html/template等模板包提供的,它们提供了一个将变量值填充到一个文本或HTML格式的模板的机制。
diff --git a/ch4/ch4.html b/ch4/ch4.html index 99a5996..e9b9e78 100644 --- a/ch4/ch4.html +++ b/ch4/ch4.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
第4章 复合数据类型
在第三章我们讨论了基本数据类型,它们可以用于构建程序中数据的结构,是Go语言世界的原子。在本章,我们将讨论复合数据类型,它是以不同的方式组合基本类型而构造出来的复合数据类型。我们主要讨论四种类型——数组、slice、map和结构体——同时在本章的最后,我们将演示如何使用结构体来解码和编码到对应JSON格式的数据,并且通过结合使用模板来生成HTML页面。
diff --git a/ch5/ch5-01.html b/ch5/ch5-01.html index 82d72d1..448ff69 100644 --- a/ch5/ch5-01.html +++ b/ch5/ch5-01.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
5.1. 函数声明
函数声明包括函数名、形式参数列表、返回值列表(可省略)以及函数体。
diff --git a/ch5/ch5-02.html b/ch5/ch5-02.html index 0ded183..55d8b57 100644 --- a/ch5/ch5-02.html +++ b/ch5/ch5-02.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
5.2. 递归
函数可以是递归的,这意味着函数可以直接或间接的调用自身。对许多问题而言,递归是一种强有力的技术,例如处理递归的数据结构。在4.4节,我们通过遍历二叉树来实现简单的插入排序,在本章节,我们再次使用它来处理HTML文件。
diff --git a/ch5/ch5-03.html b/ch5/ch5-03.html index 95273dd..487092a 100644 --- a/ch5/ch5-03.html +++ b/ch5/ch5-03.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
5.3. 多返回值
在Go中,一个函数可以返回多个值。我们已经在之前例子中看到,许多标准库中的函数返回2个值,一个是期望得到的返回值,另一个是函数出错时的错误信息。下面的例子会展示如何编写多返回值的函数。
diff --git a/ch5/ch5-04.html b/ch5/ch5-04.html index 5e46d1c..bc3cd8a 100644 --- a/ch5/ch5-04.html +++ b/ch5/ch5-04.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
5.4. 错误
在Go中有一部分函数总是能成功的运行。比如strings.Contains和strconv.FormatBool函数,对各种可能的输入都做了良好的处理,使得运行时几乎不会失败,除非遇到灾难性的、不可预料的情况,比如运行时的内存溢出。导致这种错误的原因很复杂,难以处理,从错误中恢复的可能性也很低。
diff --git a/ch5/ch5-05.html b/ch5/ch5-05.html index e89933b..f8540e5 100644 --- a/ch5/ch5-05.html +++ b/ch5/ch5-05.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
5.5. 函数值
在Go中,函数被看作第一类值(first-class values):函数像其他值一样,拥有类型,可以被赋值给其他变量,传递给函数,从函数返回。对函数值(function value)的调用类似函数调用。例子如下:
diff --git a/ch5/ch5-06.html b/ch5/ch5-06.html index 6a6e1d0..d2cb195 100644 --- a/ch5/ch5-06.html +++ b/ch5/ch5-06.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
5.6. 匿名函数
拥有函数名的函数只能在包级语法块中被声明,通过函数字面量(function literal),我们可绕过这一限制,在任何表达式中表示一个函数值。函数字面量的语法和函数声明相似,区别在于func关键字后没有函数名。函数值字面量是一种表达式,它的值被称为匿名函数(anonymous function)。
diff --git a/ch5/ch5-07.html b/ch5/ch5-07.html index 74ddae9..4a54bc6 100644 --- a/ch5/ch5-07.html +++ b/ch5/ch5-07.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
5.7. 可变参数
参数数量可变的函数称为可变参数函数。典型的例子就是fmt.Printf和类似函数。Printf首先接收一个必备的参数,之后接收任意个数的后续参数。
diff --git a/ch5/ch5-08.html b/ch5/ch5-08.html index 5fb0ef7..9f920a8 100644 --- a/ch5/ch5-08.html +++ b/ch5/ch5-08.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
5.8. Deferred函数
在findLinks的例子中,我们用http.Get的输出作为html.Parse的输入。只有url的内容的确是HTML格式的,html.Parse才可以正常工作,但实际上,url指向的内容很丰富,可能是图片,纯文本或是其他。将这些格式的内容传递给html.parse,会产生不良后果。
diff --git a/ch5/ch5-09.html b/ch5/ch5-09.html index 7086e43..f9bfd61 100644 --- a/ch5/ch5-09.html +++ b/ch5/ch5-09.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
5.9. Panic异常
Go的类型系统会在编译时捕获很多错误,但有些错误只能在运行时检查,如数组访问越界、空指针引用等。这些运行时错误会引起panic异常。
diff --git a/ch5/ch5-10.html b/ch5/ch5-10.html index 91666d9..dbd14c9 100644 --- a/ch5/ch5-10.html +++ b/ch5/ch5-10.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
5.10. Recover捕获异常
通常来说,不应该对panic异常做任何处理,但有时,也许我们可以从异常中恢复,至少我们可以在程序崩溃前,做一些操作。举个例子,当web服务器遇到不可预料的严重问题时,在崩溃前应该将所有的连接关闭;如果不做任何处理,会使得客户端一直处于等待状态。如果web服务器还在开发阶段,服务器甚至可以将异常信息反馈到客户端,帮助调试。
diff --git a/ch5/ch5.html b/ch5/ch5.html index b5d9e66..371ed7f 100644 --- a/ch5/ch5.html +++ b/ch5/ch5.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
第5章 函数
函数可以让我们将一个语句序列打包为一个单元,然后可以从程序中其它地方多次调用。函数的机制可以让我们将一个大的工作分解为小的任务,这样的小任务可以让不同程序员在不同时间、不同地方独立完成。一个函数同时对用户隐藏了其实现细节。由于这些因素,对于任何编程语言来说,函数都是一个至关重要的部分。
diff --git a/ch6/ch6-01.html b/ch6/ch6-01.html index fdde27d..358c36d 100644 --- a/ch6/ch6-01.html +++ b/ch6/ch6-01.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
6.1. 方法声明
在函数声明时,在其名字之前放上一个变量,即是一个方法。这个附加的参数会将该函数附加到这种类型上,即相当于为这种类型定义了一个独占的方法。
diff --git a/ch6/ch6-02.html b/ch6/ch6-02.html index 0181afe..69b5e58 100644 --- a/ch6/ch6-02.html +++ b/ch6/ch6-02.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
6.2. 基于指针对象的方法
当调用一个函数时,会对其每一个参数值进行拷贝,如果一个函数需要更新一个变量,或者函数的其中一个参数实在太大我们希望能够避免进行这种默认的拷贝,这种情况下我们就需要用到指针了。对应到我们这里用来更新接收器的对象的方法,当这个接受者变量本身比较大时,我们就可以用其指针而不是对象来声明方法,如下:
diff --git a/ch6/ch6-03.html b/ch6/ch6-03.html index a3a28ce..2da3734 100644 --- a/ch6/ch6-03.html +++ b/ch6/ch6-03.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
6.3. 通过嵌入结构体来扩展类型
来看看ColoredPoint这个类型:
diff --git a/ch6/ch6-04.html b/ch6/ch6-04.html index 0e9e828..afec506 100644 --- a/ch6/ch6-04.html +++ b/ch6/ch6-04.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
6.4. 方法值和方法表达式
我们经常选择一个方法,并且在同一个表达式里执行,比如常见的p.Distance()形式,实际上将其分成两步来执行也是可能的。p.Distance叫作“选择器”,选择器会返回一个方法“值”->一个将方法(Point.Distance)绑定到特定接收器变量的函数。这个函数可以不通过指定其接收器即可被调用;即调用时不需要指定接收器(译注:因为已经在前文中指定过了),只要传入函数的参数即可:
diff --git a/ch6/ch6-05.html b/ch6/ch6-05.html index 1cfe6ad..1ad5a17 100644 --- a/ch6/ch6-05.html +++ b/ch6/ch6-05.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
6.5. 示例: Bit数组
Go语言里的集合一般会用map[T]bool这种形式来表示,T代表元素类型。集合用map类型来表示虽然非常灵活,但我们可以以一种更好的形式来表示它。例如在数据流分析领域,集合元素通常是一个非负整数,集合会包含很多元素,并且集合会经常进行并集、交集操作,这种情况下,bit数组会比map表现更加理想。(译注:这里再补充一个例子,比如我们执行一个http下载任务,把文件按照16kb一块划分为很多块,需要有一个全局变量来标识哪些块下载完成了,这种时候也需要用到bit数组。)
diff --git a/ch6/ch6-06.html b/ch6/ch6-06.html index 3baef0d..cce9d32 100644 --- a/ch6/ch6-06.html +++ b/ch6/ch6-06.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
6.6. 封装
一个对象的变量或者方法如果对调用方是不可见的话,一般就被定义为“封装”。封装有时候也被叫做信息隐藏,同时也是面向对象编程最关键的一个方面。
diff --git a/ch6/ch6.html b/ch6/ch6.html index 0be75b0..006fd69 100644 --- a/ch6/ch6.html +++ b/ch6/ch6.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
第6章 方法
从90年代早期开始,面向对象编程(OOP)就成为了称霸工程界和教育界的编程范式,所以之后几乎所有大规模被应用的语言都包含了对OOP的支持,go语言也不例外。
diff --git a/ch7/ch7-01.html b/ch7/ch7-01.html index c704e03..468a720 100644 --- a/ch7/ch7-01.html +++ b/ch7/ch7-01.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
7.1. 接口约定
目前为止,我们看到的类型都是具体的类型。一个具体的类型可以准确的描述它所代表的值,并且展示出对类型本身的一些操作方式:就像数字类型的算术操作,切片类型的取下标、添加元素和范围获取操作。具体的类型还可以通过它的内置方法提供额外的行为操作。总的来说,当你拿到一个具体的类型时你就知道它的本身是什么和你可以用它来做什么。
diff --git a/ch7/ch7-02.html b/ch7/ch7-02.html index bd97b27..c907b31 100644 --- a/ch7/ch7-02.html +++ b/ch7/ch7-02.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
7.2. 接口类型
接口类型具体描述了一系列方法的集合,一个实现了这些方法的具体类型是这个接口类型的实例。
diff --git a/ch7/ch7-03.html b/ch7/ch7-03.html index 1d1b094..ca58c39 100644 --- a/ch7/ch7-03.html +++ b/ch7/ch7-03.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
7.3. 实现接口的条件
一个类型如果拥有一个接口需要的所有方法,那么这个类型就实现了这个接口。例如,*os.File
类型实现了io.Reader,Writer,Closer,和ReadWriter接口。*bytes.Buffer
实现了Reader,Writer,和ReadWriter这些接口,但是它没有实现Closer接口因为它不具有Close方法。Go的程序员经常会简要的把一个具体的类型描述成一个特定的接口类型。举个例子,*bytes.Buffer
是io.Writer;*os.Files
是io.ReadWriter。
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
7.4. flag.Value接口
在本章,我们会学到另一个标准的接口类型flag.Value是怎么帮助命令行标记定义新的符号的。思考下面这个会休眠特定时间的程序:
diff --git a/ch7/ch7-05.html b/ch7/ch7-05.html index 1f228c5..546b2ff 100644 --- a/ch7/ch7-05.html +++ b/ch7/ch7-05.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
7.5. 接口值
概念上讲一个接口的值,接口值,由两个部分组成,一个具体的类型和那个类型的值。它们被称为接口的动态类型和动态值。对于像Go语言这种静态类型的语言,类型是编译期的概念;因此一个类型不是一个值。在我们的概念模型中,一些提供每个类型信息的值被称为类型描述符,比如类型的名称和方法。在一个接口值中,类型部分代表与之相关类型的描述符。
diff --git a/ch7/ch7-06.html b/ch7/ch7-06.html index 5fd9852..6d56d26 100644 --- a/ch7/ch7-06.html +++ b/ch7/ch7-06.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
7.6. sort.Interface接口
排序操作和字符串格式化一样是很多程序经常使用的操作。尽管一个最短的快排程序只要15行就可以搞定,但是一个健壮的实现需要更多的代码,并且我们不希望每次我们需要的时候都重写或者拷贝这些代码。
diff --git a/ch7/ch7-07.html b/ch7/ch7-07.html index 3eec7e0..598bd35 100644 --- a/ch7/ch7-07.html +++ b/ch7/ch7-07.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
7.7. http.Handler接口
在第一章中,我们粗略的了解了怎么用net/http包去实现网络客户端(§1.5)和服务器(§1.7)。在这个小节中,我们会对那些基于http.Handler接口的服务器API做更进一步的学习:
diff --git a/ch7/ch7-08.html b/ch7/ch7-08.html index 331067f..c50650c 100644 --- a/ch7/ch7-08.html +++ b/ch7/ch7-08.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
7.8. error接口
从本书的开始,我们就已经创建和使用过神秘的预定义error类型,而且没有解释它究竟是什么。实际上它就是interface类型,这个类型有一个返回错误信息的单一方法:
diff --git a/ch7/ch7-09.html b/ch7/ch7-09.html index a9f55c0..5fa6e0b 100644 --- a/ch7/ch7-09.html +++ b/ch7/ch7-09.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
7.9. 示例: 表达式求值
在本节中,我们会构建一个简单算术表达式的求值器。我们将使用一个接口Expr来表示Go语言中任意的表达式。现在这个接口不需要有方法,但是我们后面会为它增加一些。
diff --git a/ch7/ch7-10.html b/ch7/ch7-10.html index 065128e..5b128d0 100644 --- a/ch7/ch7-10.html +++ b/ch7/ch7-10.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
7.10. 类型断言
类型断言是一个使用在接口值上的操作。语法上它看起来像x.(T)被称为断言类型,这里x表示一个接口的类型和T表示一个类型。一个类型断言检查它操作对象的动态类型是否和断言的类型匹配。
diff --git a/ch7/ch7-11.html b/ch7/ch7-11.html index bf4a126..a4d5d90 100644 --- a/ch7/ch7-11.html +++ b/ch7/ch7-11.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
7.11. 基于类型断言区别错误类型
思考在os包中文件操作返回的错误集合。I/O可以因为任何数量的原因失败,但是有三种经常的错误必须进行不同的处理:文件已经存在(对于创建操作),找不到文件(对于读取操作),和权限拒绝。os包中提供了三个帮助函数来对给定的错误值表示的失败进行分类:
diff --git a/ch7/ch7-12.html b/ch7/ch7-12.html index 6f7e210..e0e9c68 100644 --- a/ch7/ch7-12.html +++ b/ch7/ch7-12.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
7.12. 通过类型断言询问行为
下面这段逻辑和net/http包中web服务器负责写入HTTP头字段(例如:"Content-type:text/html")的部分相似。io.Writer接口类型的变量w代表HTTP响应;写入它的字节最终被发送到某个人的web浏览器上。
diff --git a/ch7/ch7-13.html b/ch7/ch7-13.html index ab8e4f0..ab77660 100644 --- a/ch7/ch7-13.html +++ b/ch7/ch7-13.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
7.13. 类型分支
接口被以两种不同的方式使用。在第一个方式中,以io.Reader,io.Writer,fmt.Stringer,sort.Interface,http.Handler和error为典型,一个接口的方法表达了实现这个接口的具体类型间的相似性,但是隐藏了代码的细节和这些具体类型本身的操作。重点在于方法上,而不是具体的类型上。
diff --git a/ch7/ch7-14.html b/ch7/ch7-14.html index af36cbd..9fa9d15 100644 --- a/ch7/ch7-14.html +++ b/ch7/ch7-14.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
7.14. 示例: 基于标记的XML解码
第4.5章节展示了如何使用encoding/json包中的Marshal和Unmarshal函数来将JSON文档转换成Go语言的数据结构。encoding/xml包提供了一个相似的API。当我们想构造一个文档树的表示时使用encoding/xml包会很方便,但是对于很多程序并不是必须的。encoding/xml包也提供了一个更低层的基于标记的API用于XML解码。在基于标记的样式中,解析器消费输入并产生一个标记流;四个主要的标记类型-StartElement,EndElement,CharData,和Comment-每一个都是encoding/xml包中的具体类型。每一个对(*xml.Decoder).Token的调用都返回一个标记。
diff --git a/ch7/ch7-15.html b/ch7/ch7-15.html index 7bbeed5..5ecbbc9 100644 --- a/ch7/ch7-15.html +++ b/ch7/ch7-15.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
7.15. 一些建议
当设计一个新的包时,新手Go程序员总是先创建一套接口,然后再定义一些满足它们的具体类型。这种方式的结果就是有很多的接口,它们中的每一个仅只有一个实现。不要再这么做了。这种接口是不必要的抽象;它们也有一个运行时损耗。你可以使用导出机制(§6.6)来限制一个类型的方法或一个结构体的字段是否在包外可见。接口只有当有两个或两个以上的具体类型必须以相同的方式进行处理时才需要。
diff --git a/ch7/ch7.html b/ch7/ch7.html index 8a2d9fe..51291aa 100644 --- a/ch7/ch7.html +++ b/ch7/ch7.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
第7章 接口
接口类型是对其它类型行为的抽象和概括;因为接口类型不会和特定的实现细节绑定在一起,通过这种抽象的方式我们可以让我们的函数更加灵活和更具有适应能力。
diff --git a/ch8/ch8-01.html b/ch8/ch8-01.html index c1c1672..e749d64 100644 --- a/ch8/ch8-01.html +++ b/ch8/ch8-01.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
8.1. Goroutines
在Go语言中,每一个并发的执行单元叫作一个goroutine。设想这里的一个程序有两个函数,一个函数做计算,另一个输出结果,假设两个函数没有相互之间的调用关系。一个线性的程序会先调用其中的一个函数,然后再调用另一个。如果程序中包含多个goroutine,对两个函数的调用则可能发生在同一时刻。马上就会看到这样的一个程序。
diff --git a/ch8/ch8-02.html b/ch8/ch8-02.html index 15bd4dd..fa8d1c0 100644 --- a/ch8/ch8-02.html +++ b/ch8/ch8-02.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
8.2. 示例: 并发的Clock服务
网络编程是并发大显身手的一个领域,由于服务器是最典型的需要同时处理很多连接的程序,这些连接一般来自于彼此独立的客户端。在本小节中,我们会讲解go语言的net包,这个包提供编写一个网络客户端或者服务器程序的基本组件,无论两者间通信是使用TCP、UDP或者Unix domain sockets。在第一章中我们使用过的net/http包里的方法,也算是net包的一部分。
diff --git a/ch8/ch8-03.html b/ch8/ch8-03.html index c430c93..8b1a5e9 100644 --- a/ch8/ch8-03.html +++ b/ch8/ch8-03.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
8.3. 示例: 并发的Echo服务
clock服务器每一个连接都会起一个goroutine。在本节中我们会创建一个echo服务器,这个服务在每个连接中会有多个goroutine。大多数echo服务仅仅会返回他们读取到的内容,就像下面这个简单的handleConn函数所做的一样:
diff --git a/ch8/ch8-04.html b/ch8/ch8-04.html index 060ff5a..8652773 100644 --- a/ch8/ch8-04.html +++ b/ch8/ch8-04.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
8.4. Channels
如果说goroutine是Go语言程序的并发体的话,那么channels则是它们之间的通信机制。一个channel是一个通信机制,它可以让一个goroutine通过它给另一个goroutine发送值信息。每个channel都有一个特殊的类型,也就是channels可发送数据的类型。一个可以发送int类型数据的channel一般写为chan int。
diff --git a/ch8/ch8-05.html b/ch8/ch8-05.html index 393f6bf..e3a8a65 100644 --- a/ch8/ch8-05.html +++ b/ch8/ch8-05.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
8.5. 并发的循环
本节中,我们会探索一些用来在并行时循环迭代的常见并发模型。我们会探究从全尺寸图片生成一些缩略图的问题。gopl.io/ch8/thumbnail包提供了ImageFile函数来帮我们拉伸图片。我们不会说明这个函数的实现,只需要从gopl.io下载它。
diff --git a/ch8/ch8-06.html b/ch8/ch8-06.html index c763358..2d393bc 100644 --- a/ch8/ch8-06.html +++ b/ch8/ch8-06.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
8.6. 示例: 并发的Web爬虫
在5.6节中,我们做了一个简单的web爬虫,用bfs(广度优先)算法来抓取整个网站。在本节中,我们会让这个爬虫并行化,这样每一个彼此独立的抓取命令可以并行进行IO,最大化利用网络资源。crawl函数和gopl.io/ch5/findlinks3中的是一样的。
diff --git a/ch8/ch8-07.html b/ch8/ch8-07.html index 39d9600..ff81020 100644 --- a/ch8/ch8-07.html +++ b/ch8/ch8-07.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
8.7. 基于select的多路复用
下面的程序会进行火箭发射的倒计时。time.Tick函数返回一个channel,程序会周期性地像一个节拍器一样向这个channel发送事件。每一个事件的值是一个时间戳,不过更有意思的是其传送方式。
diff --git a/ch8/ch8-08.html b/ch8/ch8-08.html index 7eea3c5..658ddc8 100644 --- a/ch8/ch8-08.html +++ b/ch8/ch8-08.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
8.8. 示例: 并发的目录遍历
在本小节中,我们会创建一个程序来生成指定目录的硬盘使用情况报告,这个程序和Unix里的du工具比较相似。大多数工作用下面这个walkDir函数来完成,这个函数使用dirents函数来枚举一个目录下的所有入口。
diff --git a/ch8/ch8-09.html b/ch8/ch8-09.html index 062509f..2bd3cfc 100644 --- a/ch8/ch8-09.html +++ b/ch8/ch8-09.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
8.9. 并发的退出
有时候我们需要通知goroutine停止它正在干的事情,比如一个正在执行计算的web服务,然而它的客户端已经断开了和服务端的连接。
diff --git a/ch8/ch8-10.html b/ch8/ch8-10.html index c6eafa4..b00579b 100644 --- a/ch8/ch8-10.html +++ b/ch8/ch8-10.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
8.10. 示例: 聊天服务
我们用一个聊天服务器来终结本章节的内容,这个程序可以让一些用户通过服务器向其它所有用户广播文本消息。这个程序中有四种goroutine。main和broadcaster各自是一个goroutine实例,每一个客户端的连接都会有一个handleConn和clientWriter的goroutine。broadcaster是select用法的不错的样例,因为它需要处理三种不同类型的消息。
diff --git a/ch8/ch8.html b/ch8/ch8.html index 2180943..b0c7953 100644 --- a/ch8/ch8.html +++ b/ch8/ch8.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
第8章 Goroutines和Channels
并发程序指同时进行多个任务的程序,随着硬件的发展,并发程序变得越来越重要。Web服务器会一次处理成千上万的请求。平板电脑和手机app在渲染用户画面同时还会后台执行各种计算任务和网络请求。即使是传统的批处理问题——读取数据、计算、写输出,现在也会用并发来隐藏掉I/O的操作延迟以充分利用现代计算机设备的多个核心。计算机的性能每年都在以非线性的速度增长。
diff --git a/ch9/ch9-01.html b/ch9/ch9-01.html index 1ed47c5..56d8447 100644 --- a/ch9/ch9-01.html +++ b/ch9/ch9-01.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
9.1. 竞争条件
在一个线性(就是说只有一个goroutine的)的程序中,程序的执行顺序只由程序的逻辑来决定。例如,我们有一段语句序列,第一个在第二个之前(废话),以此类推。在有两个或更多goroutine的程序中,每一个goroutine内的语句也是按照既定的顺序去执行的,但是一般情况下我们没法去知道分别位于两个goroutine的事件x和y的执行顺序,x是在y之前还是之后还是同时发生是没法判断的。当我们没有办法自信地确认一个事件是在另一个事件的前面或者后面发生的话,就说明x和y这两个事件是并发的。
diff --git a/ch9/ch9-02.html b/ch9/ch9-02.html index 2fc88bf..c6e5f54 100644 --- a/ch9/ch9-02.html +++ b/ch9/ch9-02.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
9.2. sync.Mutex互斥锁
在8.6节中,我们使用了一个buffered channel作为一个计数信号量,来保证最多只有20个goroutine会同时执行HTTP请求。同理,我们可以用一个容量只有1的channel来保证最多只有一个goroutine在同一时刻访问一个共享变量。一个只能为1和0的信号量叫做二元信号量(binary semaphore)。
diff --git a/ch9/ch9-03.html b/ch9/ch9-03.html index bcd9d10..724564a 100644 --- a/ch9/ch9-03.html +++ b/ch9/ch9-03.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
9.3. sync.RWMutex读写锁
在100刀的存款消失时不做记录多少还是会让我们有一些恐慌,Bob写了一个程序,每秒运行几百次来检查他的银行余额。他会在家,在工作中,甚至会在他的手机上来运行这个程序。银行注意到这些陡增的流量使得存款和取款有了延时,因为所有的余额查询请求是顺序执行的,这样会互斥地获得锁,并且会暂时阻止其它的goroutine运行。
diff --git a/ch9/ch9-04.html b/ch9/ch9-04.html index 28e306e..c037645 100644 --- a/ch9/ch9-04.html +++ b/ch9/ch9-04.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
9.4. 内存同步
你可能比较纠结为什么Balance方法需要用到互斥条件,无论是基于channel还是基于互斥量。毕竟和存款不一样,它只由一个简单的操作组成,所以不会碰到其它goroutine在其执行“期间”执行其它逻辑的风险。这里使用mutex有两方面考虑。第一Balance不会在其它操作比如Withdraw“中间”执行。第二(更重要的)是“同步”不仅仅是一堆goroutine执行顺序的问题,同样也会涉及到内存的问题。
diff --git a/ch9/ch9-05.html b/ch9/ch9-05.html index ab72bb2..f06f9d9 100644 --- a/ch9/ch9-05.html +++ b/ch9/ch9-05.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
9.5. sync.Once惰性初始化
如果初始化成本比较大的话,那么将初始化延迟到需要的时候再去做就是一个比较好的选择。如果在程序启动的时候就去做这类初始化的话,会增加程序的启动时间,并且因为执行的时候可能也并不需要这些变量,所以实际上有一些浪费。让我们来看在本章早一些时候的icons变量:
diff --git a/ch9/ch9-06.html b/ch9/ch9-06.html index 4d43834..77f5217 100644 --- a/ch9/ch9-06.html +++ b/ch9/ch9-06.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
9.6. 竞争条件检测
即使我们小心到不能再小心,但在并发程序中犯错还是太容易了。幸运的是,Go的runtime和工具链为我们装备了一个复杂但好用的动态分析工具,竞争检查器(the race detector)。
diff --git a/ch9/ch9-07.html b/ch9/ch9-07.html index 8705ea9..297bb8a 100644 --- a/ch9/ch9-07.html +++ b/ch9/ch9-07.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
9.7. 示例: 并发的非阻塞缓存
本节中我们会做一个无阻塞的缓存,这种工具可以帮助我们来解决现实世界中并发程序出现但没有现成的库可以解决的问题。这个问题叫作缓存(memoizing)函数(译注:Memoization的定义: memoization 一词是Donald Michie 根据拉丁语memorandum杜撰的一个词。相应的动词、过去分词、ing形式有memoiz、memoized、memoizing),也就是说,我们需要缓存函数的返回结果,这样在对函数进行调用的时候,我们就只需要一次计算,之后只要返回计算的结果就可以了。我们的解决方案会是并发安全且会避免对整个缓存加锁而导致所有操作都去争一个锁的设计。
diff --git a/ch9/ch9-08.html b/ch9/ch9-08.html index b746c2f..e4710bd 100644 --- a/ch9/ch9-08.html +++ b/ch9/ch9-08.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
9.8. Goroutines和线程
在上一章中我们说goroutine和操作系统的线程区别可以先忽略。尽管两者的区别实际上只是一个量的区别,但量变会引起质变的道理同样适用于goroutine和线程。现在正是我们来区分开两者的最佳时机。
diff --git a/ch9/ch9.html b/ch9/ch9.html index 8a80e91..7b96e7a 100644 --- a/ch9/ch9.html +++ b/ch9/ch9.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
第9章 基于共享变量的并发
前一章我们介绍了一些使用goroutine和channel这样直接而自然的方式来实现并发的方法。然而这样做我们实际上回避了在写并发代码时必须处理的一些重要而且细微的问题。
diff --git a/index.html b/index.html index e20b4ea..659caa9 100644 --- a/index.html +++ b/index.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
Go语言圣经(中文版)
Go语言圣经 《The Go Programming Language》 中文版本,仅供学习交流之用。对于希望学习CGO、Go汇编语言等高级用法的同学,我们推荐《Go语言高级编程》开源图书。如果希望深入学习Go语言语法树结构,可以参考《Go语法树入门——开启自制编程语言和编译器之旅》。如果想从头实现一个玩具Go语言可以参考《从头实现µGo语言》(µGo 是 凹语言 阶段的产物)。
diff --git a/preface-zh.html b/preface-zh.html index 356acc3..4ff17bb 100644 --- a/preface-zh.html +++ b/preface-zh.html @@ -528,7 +528,7 @@- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book
译者序
在上个世纪70年代,贝尔实验室的 Ken Thompson 和 Dennis M. Ritchie 合作发明了 UNIX 操作系统,同时 Dennis M. Ritchie 为了解决 UNIX 系统的移植性问题而发明了 C 语言,贝尔实验室的 UNIX 和 C 语言两大发明奠定了整个现代IT行业最重要的软件基础(目前的三大桌面操作系统的中Linux和Mac OS X都是源于 UNIX 系统,两大移动平台的操作系统 iOS 和 Android 也都是源于 UNIX 系统。C 系家族的编程语言占据统治地位达几十年之久)。在 UNIX 和 C 语言发明40年之后,目前已经在 Google 工作的 Ken Thompson 和 Rob Pike(他们在贝尔实验室时就是同事)、还有Robert Griesemer(设计了 V8 引擎和 HotSpot 虚拟机)一起合作,为了解决在21世纪多核和网络化环境下越来越复杂的编程问题而发明了 Go 语言。从 Go 语言库早期代码库日志可以看出它的演化历程( Git 用 git log --before={2008-03-03} --reverse
命令查看):
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- WaBook(Go语言实现的MD电子书构建工具): https://github.com/wa-lang/wabook
+
- 凹语言(Go实现, 面向WASM设计): https://github.com/wa-lang/wa
- 《Go语言高级编程》: https://github.com/chai2010/advanced-go-programming-book