Compare commits

...

29 Commits

Author SHA1 Message Date
chai2010
687fb92030 Revert "Update ch5-06.md" 2024-04-03 16:09:26 +08:00
chai2010
feac38bcf2 Merge pull request #213 from A-caibird/patch-1
Update ch5-06.md
2024-02-05 13:44:47 +08:00
Acaibrid
8df9c1211c Update ch5-06.md
返回的是一个函数,而不是返回的这个函数被调用后的返回值
2024-02-05 01:32:21 +08:00
chai2010
b8d7c32434 Merge pull request #210 from hanzhuoxian/master
第一章第二节 逻辑修正
2023-11-29 16:17:14 +08:00
chai2010
d35ce39441 Merge pull request #211 from yudianer/patch-1
Update ch3.md
2023-11-29 16:16:36 +08:00
Jack
b1b9274c8c Update ch3.md
“words” 应该指计算机里面的“字”,比如“一个字长”
2023-11-27 00:39:21 -06:00
韩卓贤
233eef7844 Merge branch 'gopl-zh:master' into master 2023-11-02 00:31:19 -05:00
hanzhuoxian
0bf3867967 变量形式描述逻辑修正 2023-11-02 13:30:40 +08:00
chai2010
c7f58f8991 Merge pull request #209 from hanzhuoxian/master
命令行参数 修正
2023-10-31 23:25:29 +08:00
hanjian
a9f4ae0bf7 命令行参数 修正 2023-10-31 20:50:14 +08:00
chai2010
bb175c69f5 Merge pull request #202 from liaosunny123/patch-2
Update ch7-01.md
2023-08-11 19:24:49 +08:00
chai2010
d948a26c96 Merge pull request #201 from liaosunny123/patch-1
Update ch1-05.md
2023-07-22 20:28:37 +08:00
EpicMo
213fe7cbaa Update ch7-01.md
修改句子
2023-07-22 15:11:55 +08:00
EpicMo
279919079a Update ch1-05.md 2023-07-20 10:20:08 +08:00
chai2010
2decff99fd Merge pull request #199 from yunmingyang/fixSynatx
Drop a '。' which may cause ambiguity in chapter 1.1
2023-06-27 22:44:30 +08:00
yunmingyang
c19fb7aff1 Drop a '。' which may cause ambiguity in chapter 1.1 2023-06-27 11:48:15 +08:00
chai2010
f4a7cd48b4 Update index.hbs 2023-06-27 01:46:06 +08:00
chai2010
0984caea57 Update README.md 2023-06-27 01:43:33 +08:00
chai2010
dba2f4c2f1 Update README.md 2023-06-27 01:42:32 +08:00
chai2010
a10ff75618 Update index.md 2023-06-27 01:42:08 +08:00
chai2010
b7cdabf84a Update preface-zh.md 2023-06-27 01:37:50 +08:00
chai2010
023499ad54 Merge pull request #194 from xingchengxia/master
fix: typo
2023-06-27 01:31:04 +08:00
chai2010
863c1951ea Update SUMMARY.md 2023-06-27 01:30:35 +08:00
chai2010
cd809c6adc Create preface-zh.md
恢复误删的译者序
2023-06-27 01:30:01 +08:00
FireAndIceCoder
4139bfabf3 fix: typo
Update ch5-02.md
2023-05-07 22:46:29 +08:00
chai2010
92199cf1ff Merge pull request #184 from whaliendev/fix-content-lost
fix: remove nbsp in SUMMARY.md
2023-03-31 18:23:09 +08:00
Hwa
81eda26917 fix: remove nbsp in SUMMARY.md 2023-03-31 15:41:28 +08:00
chai2010
145304b099 Merge pull request #135 from Glenn-Su/master
Update ch9-07.md
2022-10-24 07:50:11 +08:00
Glenn-Su
2310a57796 Update ch9-07.md
1. 与代码对应的字段不应翻译成中文
2. 部分 routine 拼写错误
2022-10-23 01:16:04 +08:00
12 changed files with 41 additions and 24 deletions

View File

@@ -1,12 +1,11 @@
# Go语言圣经中文版
- *KusonStack一站式可编程配置技术栈(Go): https://github.com/KusionStack/kusion*
- *KCL 配置编程语言(Rust): https://github.com/KusionStack/KCLVM*
- *凹语言™: https://github.com/wa-lang/wa*
- *凹语言(专为 WebAssembly 设计): https://github.com/wa-lang/wa*
- *KCL 配置语言(Rust): https://github.com/kcl-lang/kcl*
----
Go语言圣经 [《The Go Programming Language》](http://gopl.io) 中文版本仅供学习交流之用。对于希望学习CGO、Go汇编语言等高级用法的同学我们推荐[《Go语言高级编程》](https://github.com/chai2010/advanced-go-programming-book)开源图书。如果希望深入学习Go语言语法树结构可以参考[《Go语法树入门——开启自制编程语言和编译器之旅》](https://github.com/chai2010/go-ast-book)。如果想从头实现一个玩具Go语言可以参考[《从头实现µGo语言》](https://github.com/chai2010/ugo-compiler-book)。
Go语言圣经 [《The Go Programming Language》](http://gopl.io) 中文版本仅供学习交流之用。对于希望学习CGO、Go汇编语言等高级用法的同学我们推荐[《Go语言高级编程》](https://github.com/chai2010/advanced-go-programming-book)开源图书。如果希望深入学习Go语言语法树结构可以参考[《Go语法树入门——开启自制编程语言和编译器之旅》](https://github.com/chai2010/go-ast-book)。如果想从头实现一个玩具Go语言可以参考[《从头实现µGo语言》](https://github.com/wa-lang/ugo-compiler-book)µGo 是 [凹语言](https://wa-lang.org/) 阶段的产物)
![](cover.jpg)

View File

@@ -1,6 +1,7 @@
# Summary
[Go语言圣经](index.md)
[译者序](preface-zh.md)
[前言](preface.md)
* [入门](ch1/ch1.md)
@@ -76,7 +77,7 @@
* [并发的循环](ch8/ch8-05.md)
* [示例: 并发的Web爬虫](ch8/ch8-06.md)
* [基于select的多路复用](ch8/ch8-07.md)
 * [示例: 并发的目录遍历](ch8/ch8-08.md)
* [示例: 并发的目录遍历](ch8/ch8-08.md)
* [并发的退出](ch8/ch8-09.md)
* [示例: 聊天服务](ch8/ch8-10.md)
* [基于共享变量的并发](ch9/ch9.md)
@@ -84,7 +85,7 @@
* [sync.Mutex互斥锁](ch9/ch9-02.md)
* [sync.RWMutex读写锁](ch9/ch9-03.md)
* [内存同步](ch9/ch9-04.md)
 * [sync.Once惰性初始化](ch9/ch9-05.md)
* [sync.Once惰性初始化](ch9/ch9-05.md)
* [竞争条件检测](ch9/ch9-06.md)
* [示例: 并发的非阻塞缓存](ch9/ch9-07.md)
* [Goroutines和线程](ch9/ch9-08.md)
@@ -110,7 +111,7 @@
* [示例: 编码S表达式](ch12/ch12-04.md)
* [通过reflect.Value修改值](ch12/ch12-05.md)
* [示例: 解码S表达式](ch12/ch12-06.md)
 * [获取结构体字段标签](ch12/ch12-07.md)
* [获取结构体字段标签](ch12/ch12-07.md)
* [显示一个类型的方法集](ch12/ch12-08.md)
* [几点忠告](ch12/ch12-09.md)
* [底层编程](ch13/ch13.md)

View File

@@ -65,7 +65,7 @@ Go 的标准库提供了 100 多个包,以支持常见功能,如输入、输
Go 语言不需要在语句或者声明的末尾添加分号,除非一行上有多条语句。实际上,编译器会主动把特定符号后的换行符转换为分号,因此换行符添加的位置会影响 Go 代码的正确解析(译注:比如行末是标识符、整数、浮点数、虚数、字符或字符串文字、关键字 `break``continue``fallthrough``return` 中的一个、运算符和分隔符 `++``--``)``]``}` 中的一个)。举个例子,函数的左括号 `{` 必须和 `func` 函数声明在同一行上,且位于末尾,不能独占一行,而在表达式 `x+y` 中,可在 `+` 后换行,不能在 `+` 前换行(译注:以+结尾的话不会被插入分号分隔符,但是以 x 结尾的话则会被分号分隔符,从而导致编译错误)。
Go 语言在代码格式上采取了很强硬的态度。`gofmt`工具把代码格式化为标准格式译注这个格式化工具没有任何可以调整代码格式的参数Go 语言就是这么任性),并且 `go` 工具中的 `fmt` 子命令会对指定包,否则默认为当前目录中所有go 源文件应用 `gofmt` 命令。本书中的所有代码都被 gofmt 过。你也应该养成格式化自己的代码的习惯。以法令方式规定标准的代码格式可以避免无尽的无意义的琐碎争执(译注:也导致了 Go 语言的 TIOBE 排名较低,因为缺少撕逼的话题)。更重要的是,这样可以做多种自动源码转换,如果放任 Go 语言代码格式,这些转换就不大可能了。
Go 语言在代码格式上采取了很强硬的态度。`gofmt`工具把代码格式化为标准格式译注这个格式化工具没有任何可以调整代码格式的参数Go 语言就是这么任性),并且 `go` 工具中的 `fmt` 子命令会对指定包否则默认为当前目录中所有go 源文件应用 `gofmt` 命令。本书中的所有代码都被 gofmt 过。你也应该养成格式化自己的代码的习惯。以法令方式规定标准的代码格式可以避免无尽的无意义的琐碎争执(译注:也导致了 Go 语言的 TIOBE 排名较低,因为缺少撕逼的话题)。更重要的是,这样可以做多种自动源码转换,如果放任 Go 语言代码格式,这些转换就不大可能了。
很多文本编辑器都可以配置为保存文件时自动执行 `gofmt`,这样你的源代码总会被恰当地格式化。还有个相关的工具:`goimports`,可以根据代码需要,自动地添加或删除 `import` 声明。这个工具并没有包含在标准的分发包中,可以用下面的命令安装:

View File

@@ -35,7 +35,7 @@ func main() {
`var` 声明定义了两个 `string` 类型的变量 `s``sep`。变量会在声明时直接初始化。如果变量没有显式初始化,则被隐式地赋予其类型的 *零值*zero value数值类型是 `0`,字符串类型是空字符串 `""`。这个例子里,声明把 `s``sep` 隐式地初始化成空字符串。第 2 章再来详细地讲解变量和声明。
对数值类型Go 语言提供了常规的数值和逻辑运算符。而对 `string` 类型,`+` 运算符连接字符串(译注:和 C++ 或者 JavaScript 是一样的)。所以表达式:`sep + os.Args[i]` 表示连接字符串 `sep``os.Args`。程序中使用的语句:`s+=sep+os.Args[i]` 是一条 *赋值语句*,将 `s` 的旧值跟 `sep``os.Args[i]` 连接后赋值回 `s`,等价于:`s=s+sep+os.Args[i]`
对数值类型Go 语言提供了常规的数值和逻辑运算符。而对 `string` 类型,`+` 运算符连接字符串(译注:和 C++ 或者 JavaScript 是一样的)。所以表达式:`sep + os.Args[i]` 表示连接字符串 `sep``os.Args[i]`。程序中使用的语句:`s+=sep+os.Args[i]` 是一条 *赋值语句*,将 `s` 的旧值跟 `sep``os.Args[i]` 连接后赋值回 `s`,等价于:`s=s+sep+os.Args[i]`
运算符 `+=` 是赋值运算符assignment operator每种数值运算符或逻辑运算符`+``*`,都有对应的赋值运算符。
@@ -113,7 +113,7 @@ var s = ""
var s string = ""
```
用哪种不用哪种,为什么呢?第一种形式,是一条短变量声明,最简洁,但只能用在函数内部,而不能用于包变量。第二种形式依赖于字符串的默认初始化零值机制,被初始化为 `""`。第三种形式用得很少,除非同时声明多个变量。第四种形式显式地标明变量的类型,当变量类型与初值类型相同时,类型冗余,但如果两者类型不同,变量类型就必须了。实践中一般使用前两种形式中的某个,初始值重要的话就显式地指定变量的类型,否则使用隐式初始化。
用哪种不用哪种,为什么呢?第一种形式,是一条短变量声明,最简洁,但只能用在函数内部,而不能用于包变量。第二种形式依赖于字符串的默认初始化零值机制,被初始化为 `""`。第三种形式用得很少,除非同时声明多个变量。第四种形式显式地标明变量的类型,当变量类型与初值类型相同时,类型冗余,但如果两者类型不同,变量类型就必须了。实践中一般使用前两种形式中的某个,初始值重要的话就显式地指定变量的,否则指定类型使用隐式初始化。
如前文所述,每次循环迭代字符串 `s` 的内容都会更新。`+=` 连接原字符串、空格和下个参数,产生新字符串,并把它赋值给 `s``s` 原来的内容已经不再使用,将在适当时机对它进行垃圾回收。

View File

@@ -23,7 +23,7 @@ func main() {
fmt.Fprintf(os.Stderr, "fetch: %v\n", err)
os.Exit(1)
}
b, err := ioutil.ReadAll(resp.Body)
b, err := io.ReadAll(resp.Body)
resp.Body.Close()
if err != nil {
fmt.Fprintf(os.Stderr, "fetch: reading %s: %v\n", url, err)
@@ -34,7 +34,7 @@ func main() {
}
```
这个程序从两个package中导入了函数net/http和io/ioutil包http.Get函数是创建HTTP请求的函数如果获取过程没有出错那么会在resp这个结构体中得到访问的请求结果。resp的Body字段包括一个可读的服务器响应流。ioutil.ReadAll函数从response中读取到全部内容将其结果保存在变量b中。resp.Body.Close关闭resp的Body流防止资源泄露Printf函数会将结果b写出到标准输出流中。
这个程序从两个package中导入了函数net/http和iohttp.Get函数是创建HTTP请求的函数如果获取过程没有出错那么会在resp这个结构体中得到访问的请求结果。resp的Body字段包括一个可读的服务器响应流。io.ReadAll函数从response中读取到全部内容将其结果保存在变量b中。resp.Body.Close关闭resp的Body流防止资源泄露Printf函数会将结果b写出到标准输出流中。
```
$ go build gopl.io/ch1/fetch

View File

@@ -1,5 +1,5 @@
# 第3章 基础数据类型
虽然从底层而言,所有的数据都是由比特组成,但计算机一般操作的是固定大小的如整数、浮点数、比特数组、内存地址等。进一步将这些数组织在一起就可表达更多的对象例如数据包、像素点、诗歌甚至其他任何对象。Go语言提供了丰富的数据组织形式这依赖于Go语言内置的数据类型。这些内置的数据类型兼顾了硬件的特性和表达复杂数据结构的便捷性。
虽然从底层而言,所有的数据都是由比特组成,但计算机一般操作的是固定大小的如整数、浮点数、比特数组、内存地址等。进一步将这些数组织在一起就可表达更多的对象例如数据包、像素点、诗歌甚至其他任何对象。Go语言提供了丰富的数据组织形式这依赖于Go语言内置的数据类型。这些内置的数据类型兼顾了硬件的特性和表达复杂数据结构的便捷性。
Go语言将数据类型分为四类基础类型、复合类型、引用类型和接口类型。本章介绍基础类型包括数字、字符串和布尔型。复合数据类型——数组§4.1和结构体§4.2——是通过组合简单类型来表达更加复杂的数据结构。引用类型包括指针§2.3.2、切片§4.2)、字典§4.3、函数§5、通道§8虽然数据种类很多但它们都是对程序中一个变量或状态的间接引用。这意味着对任一引用类型数据的修改都会影响所有该引用的拷贝。我们将在第7章介绍接口类型。

View File

@@ -4,7 +4,7 @@
下文的示例代码使用了非标准包 golang.org/x/net/html 解析HTML。golang.org/x/... 目录下存储了一些由Go团队设计、维护对网络编程、国际化文件处理、移动平台、图像处理、加密解密、开发者工具提供支持的扩展包。未将这些扩展包加入到标准库原因有二一是部分包仍在开发中二是对大多数Go语言的开发者而言扩展包提供的功能很少被使用。
例子中调用golang.org/x/net/html的部分api如下所示。html.Parse函数读入一组bytes解析后返回html.Node类型的HTML页面树状结构根节点。HTML拥有很多类型的结点如text文本、commnets注释类型在下面的例子中我们 只关注< name key='value' >形式的结点。
例子中调用golang.org/x/net/html的部分api如下所示。html.Parse函数读入一组bytes解析后返回html.Node类型的HTML页面树状结构根节点。HTML拥有很多类型的结点如text文本、comments注释类型在下面的例子中我们 只关注< name key='value' >形式的结点。
<u><i>golang.org/x/net/html</i></u>
```Go

View File

@@ -20,10 +20,9 @@ func Sprintf(format string, args ...interface{}) string {
}
```
Fprintf的前缀F表示文件File也表明格式化输出结果应该被写入第一个参数提供的文件中。在Printf函数中的第一个参数os.Stdout是`*os.File`类型在Sprintf函数中的第一个参数&buf是一个指向可以写入字节的内存缓冲区然而它
并不是一个文件类型尽管它在某种意义上和文件类型相似。
Fprintf的前缀F表示文件File也表明格式化输出结果应该被写入第一个参数提供的文件中。在Printf函数中的第一个参数os.Stdout是`*os.File`类型在Sprintf函数中的第一个参数&buf是一个指向可以写入字节的内存缓冲区然而它并不是一个文件类型,尽管它在某种意义上和文件类型相似。
即使Fprintf函数中的第一个参数也不是一个文件类型。它是io.Writer类型这是一个接口类型定义如下
即使Fprintf函数中的第一个参数,它也不是一个文件类型。它是io.Writer类型这是一个接口类型定义如下
``` go
package io

View File

@@ -199,7 +199,7 @@ func (memo *Memo) Get(key string) (value interface{}, err error) {
这些修改使性能再次得到了提升但有一些URL被获取了两次。这种情况在两个以上的goroutine同一时刻调用Get来请求同样的URL时会发生。多个goroutine一起查询cache发现没有值然后一起调用f这个慢不拉叽的函数。在得到结果后也都会去更新map。其中一个获得的结果会覆盖掉另一个的结果。
理想情况下是应该避免掉多余的工作的。而这种“避免”工作一般被称为duplicate suppression重复抑制/避免。下面版本的Memo每一个map元素都是指向一个条目的指针。每一个条目包含对函数f调用结果的内容缓存。与之前不同的是这次entry还包含了一个叫ready的channel。在条目的结果被设置之后这个channel就会被关闭以向其它goroutine广播§8.9)去读取该条目内的结果是安全的了。
理想情况下是应该避免掉多余的工作的。而这种“避免”工作一般被称为duplicate suppression重复抑制/避免。下面版本的Memo每一个map元素都是指向一个条目的指针。每一个entry包含对函数f调用结果的内容缓存。与之前不同的是这次entry还包含了一个叫ready的channel。在entry的res字段被设置之后这个channel就会被关闭以向其它goroutine广播§8.9)去读取该entry内的结果是安全的了。
<u><i>gopl.io/ch9/memo4</i></u>
```go
@@ -334,7 +334,7 @@ func (e *entry) deliver(response chan<- result) {
和基于互斥量的版本类似第一个对某个key的请求需要负责去调用函数f并传入这个key将结果存在条目里并关闭ready channel来广播条目的ready消息。使用`(*entry).call`来完成上述工作。
紧接着对同一个key的请求会发现map中已经有了存在的条目然后会等待结果变为ready并将结果从response发送给客户端的goroutien。上述工作是用`(*entry).deliver`来完成的。对call和deliver方法的调用必须让它们在自己的goroutine中进行以确保monitor goroutines不会因此而被阻塞住而没法处理新的请求。
紧接着对同一个key的请求会发现map中已经有了存在的条目然后会等待结果变为ready并将结果从response发送给客户端的goroutine。上述工作是用`(*entry).deliver`来完成的。对call和deliver方法的调用必须让它们在自己的goroutine中进行以确保monitor goroutines不会因此而被阻塞住而没法处理新的请求。
这个例子说明我们无论用上锁,还是通信来建立并发程序都是可行的。

View File

@@ -1,6 +1,6 @@
# Go语言圣经中文版
Go语言圣经 [《The Go Programming Language》](http://gopl.io) 中文版本仅供学习交流之用。对于希望学习CGO、Go汇编语言等高级用法的同学我们推荐[《Go语言高级编程》](https://github.com/chai2010/advanced-go-programming-book)开源图书。如果希望深入学习Go语言语法树结构可以参考[《Go语法树入门——开启自制编程语言和编译器之旅》](https://github.com/chai2010/go-ast-book)。如果想从头实现一个玩具Go语言可以参考[《从头实现µGo语言》](https://github.com/chai2010/ugo-compiler-book)。
Go语言圣经 [《The Go Programming Language》](http://gopl.io) 中文版本仅供学习交流之用。对于希望学习CGO、Go汇编语言等高级用法的同学我们推荐[《Go语言高级编程》](https://github.com/chai2010/advanced-go-programming-book)开源图书。如果希望深入学习Go语言语法树结构可以参考[《Go语法树入门——开启自制编程语言和编译器之旅》](https://github.com/chai2010/go-ast-book)。如果想从头实现一个玩具Go语言可以参考[《从头实现µGo语言》](https://github.com/wa-lang/ugo-compiler-book)µGo 是 [凹语言](https://wa-lang.org/) 阶段的产物)
![](cover.jpg)

19
preface-zh.md Normal file
View File

@@ -0,0 +1,19 @@
# 译者序
在上个世纪70年代贝尔实验室的 [Ken Thompson](http://genius.cat-v.org/ken-thompson/) 和 [Dennis M. Ritchie](http://genius.cat-v.org/dennis-ritchie/) 合作发明了 [UNIX](http://doc.cat-v.org/unix/) 操作系统,同时 [Dennis M. Ritchie](http://genius.cat-v.org/dennis-ritchie/) 为了解决 [UNIX](http://doc.cat-v.org/unix/) 系统的移植性问题而发明了 C 语言,贝尔实验室的 [UNIX](http://doc.cat-v.org/unix/) 和 C 语言两大发明奠定了整个现代IT行业最重要的软件基础目前的三大桌面操作系统的中[Linux](http://www.linux.org/)和[Mac OS X](http://www.apple.com/cn/osx/)都是源于 [UNIX](http://doc.cat-v.org/unix/) 系统,两大移动平台的操作系统 iOS 和 Android 也都是源于 [UNIX](http://doc.cat-v.org/unix/) 系统。C 系家族的编程语言占据统治地位达几十年之久)。在 [UNIX](http://doc.cat-v.org/unix/) 和 C 语言发明40年之后目前已经在 Google 工作的 [Ken Thompson](http://genius.cat-v.org/ken-thompson/) 和 [Rob Pike](http://genius.cat-v.org/rob-pike/)(他们在贝尔实验室时就是同事)、还有[Robert Griesemer](http://research.google.com/pubs/author96.html)(设计了 V8 引擎和 HotSpot 虚拟机一起合作为了解决在21世纪多核和网络化环境下越来越复杂的编程问题而发明了 Go 语言。从 Go 语言库早期代码库日志可以看出它的演化历程( Git 用 `git log --before={2008-03-03} --reverse` 命令查看):
![](./images/go-log04.png)
从早期提交日志中也可以看出Go 语言是从 [Ken Thompson](http://genius.cat-v.org/ken-thompson/) 发明的 B 语言、[Dennis M. Ritchie](http://genius.cat-v.org/dennis-ritchie/) 发明的 C 语言逐步演化过来的,是 C 语言家族的成员,因此很多人将 Go 语言称为 21 世纪的 C 语言。纵观这几年来的发展趋势Go 语言已经成为云计算、云存储时代最重要的基础编程语言。
在 C 语言发明之后约5年的时间之后1978年[Brian W. Kernighan](http://www.cs.princeton.edu/~bwk/) 和 [Dennis M. Ritchie](http://genius.cat-v.org/dennis-ritchie/) 合作编写出版了C语言方面的经典教材《[The C Programming Language](http://s3-us-west-2.amazonaws.com/belllabs-microsite-dritchie/cbook/index.html)》,该书被誉为 C 语言程序员的圣经,作者也被大家亲切地称为 [K&R](https://en.wikipedia.org/wiki/K%26R)。同样在 Go 语言正式发布2009 年)约 5 年之后2014 年开始写作2015 年出版),由 Go 语言核心团队成员 [Alan A. A. Donovan](https://github.com/adonovan) 和 [K&R](https://en.wikipedia.org/wiki/K%26R) 中的 [Brian W. Kernighan](http://www.cs.princeton.edu/~bwk/) 合作编写了Go语言方面的经典教材《[The Go Programming Language](http://gopl.io)》。Go 语言被誉为 21 世纪的 C 语言,如果说 [K&R](https://en.wikipedia.org/wiki/K%26R) 所著的是圣经的旧约,那么 D&K 所著的必将成为圣经的新约。该书介绍了 Go 语言几乎全部特性,并且随着语言的深入层层递进,对每个细节都解读得非常细致,每一节内容都精彩不容错过,是广大 Gopher 的必读书目。大部分 Go 语言核心团队的成员都参与了该书校对工作,因此该书的质量是可以完全放心的。
同时,单凭阅读和学习其语法结构并不能真正地掌握一门编程语言,必须进行足够多的编程实践——亲自编写一些程序并研究学习别人写的程序。要从利用 Go 语言良好的特性使得程序模块化,充分利用 Go 的标准函数库以 Go 语言自己的风格来编写程序。书中包含了上百个精心挑选的习题,希望大家能先用自己的方式尝试完成习题,然后再参考官方给出的解决方案。
该书英文版约从 2015 年 10 月开始公开发售,其中日文版本最早参与翻译和审校(参考致谢部分)。在 2015 年 10 月,我们并不知道中文版是否会及时引进、将由哪家出版社引进、引进将由何人来翻译、何时能出版,这些信息都成了一个秘密。中国的 Go 语言社区是全球最大的Go语言社区我们从一开始就始终紧跟着 Go 语言的发展脚步。我们应该也完全有能力以中国 Go 语言社区的力量同步完成 Go 语言圣经中文版的翻译工作。与此同时,国内有很多 Go 语言爱好者也在积极关注该书(本人也在第一时间购买了纸质版本,[亚马逊价格314人民币](http://www.amazon.cn/The-Go-Programming-Language-Donovan-Alan-A-A/dp/0134190440/)。补充:国内也即将出版英文版,[价格79元](http://product.china-pub.com/4912464))。为了 Go 语言的学习和交流,大家决定合作免费翻译该书。
翻译工作从 2015 年 11 月 20 日前后开始,到 2016 年 1 月底初步完成,前后历时约 2 个月时间(在其它语言版本中,全球第一个完成翻译的,基本做到和原版同步)。其中,[chai2010](https://github.com/chai2010) 翻译了前言、第2 ~ 4章、第10 ~ 13章[Xargin](https://github.com/cch123) 翻译了第1章、第6章、第8 ~ 9章[CrazySssst](https://github.com/CrazySssst) 翻译了第5章[foreversmart](https://github.com/foreversmart) 翻译了第7章大家共同参与了基本的校验工作还有其他一些朋友提供了积极的反馈建议。如果大家还有任何问题或建议可以直接到中文版项目页面提交 [Issue](https://github.com/golang-china/gopl-zh/issues),如果发现英文版原文在[勘误](http://www.gopl.io/errata.html)中未提到的任何错误,可以直接去[英文版项目](https://github.com/adonovan/gopl.io/)提交。
最后希望这本书能够帮助大家用Go语言快乐地编程。
2016年 1月 于 武汉

View File

@@ -186,10 +186,9 @@
<main>
<!-- 头部 -->
<ul dir="auto">
<li><em>KusonStack一站式可编程配置技术栈(Go): <a href="https://github.com/KusionStack/kusion">https://github.com/KusionStack/kusion</a></em></li>
<li><em>KCL 配置编程语言(Rust): <a href="https://github.com/KusionStack/KCLVM">https://github.com/KusionStack/KCLVM</a></em></li>
<li><em>凹语言™: <a href="https://github.com/wa-lang/wa">https://github.com/wa-lang/wa</a></em></li>
</ul>
<li><em>凹语言(专为 WebAssembly 设计): <a href="https://github.com/wa-lang/wa">https://github.com/wa-lang/wa</a></em></li>
<li><em>KCL 配置语言(Rust): <a href="https://github.com/kcl-lang/kcl">https://github.com/kcl-lang/kcl</a></em></li>
</ul>
<hr>
{{{ content }}}