diff --git a/appendix/appendix-b-author.md b/appendix/appendix-b-author.md index 3eb768b..b1452c9 100644 --- a/appendix/appendix-b-author.md +++ b/appendix/appendix-b-author.md @@ -11,7 +11,7 @@ 中文译者 | 章节 -------------------------------------- | ------------------------- -`chai2010 ` | 前言/第2~4章/第10~13章 -`Xargin ` | 第1章/第6章/第8~9章 +`chai2010 ` | 前言/第2 ~ 4章/第10 ~ 13章 +`Xargin ` | 第1章/第6章/第8 ~ 9章 `CrazySssst` | 第5章 `foreversmart ` | 第7章 diff --git a/ch1/ch1.md b/ch1/ch1.md index 45c239e..c0ee46e 100644 --- a/ch1/ch1.md +++ b/ch1/ch1.md @@ -1,4 +1,4 @@ -# 第一章 入门 +# 第一章 入门 本章介绍Go语言的基础组件。本章提供了足够的信息和示例程序,希望可以帮你尽快入门, 写出有用的程序。本章和之后章节的示例程序都针对你可能遇到的现实案例。先了解几个Go程序,涉及的主题从简单的文件处理、图像处理到互联网客户端和服务端并发。当然,第一章不会解释细枝末节,但用这些程序来学习一门新语言还是很有效的。 diff --git a/ch10/ch10.md b/ch10/ch10.md index 1344731..9bbc10a 100644 --- a/ch10/ch10.md +++ b/ch10/ch10.md @@ -1,4 +1,4 @@ -# 第十章 包和工具 +# 第十章 包和工具 现在随便一个小程序的实现都可能包含超过10000个函数。然而作者一般只需要考虑其中很小的一部分和做很少的设计,因为绝大部分代码都是由他人编写的,它们通过类似包或模块的方式被重用。 diff --git a/ch11/ch11.md b/ch11/ch11.md index 41e6212..48526da 100644 --- a/ch11/ch11.md +++ b/ch11/ch11.md @@ -1,4 +1,4 @@ -# 第十一章 测试 +# 第十一章 测试 Maurice Wilkes,第一个存储程序计算机EDSAC的设计者,1949年他在实验室爬楼梯时有一个顿悟。在《计算机先驱回忆录》(Memoirs of a Computer Pioneer)里,他回忆到:“忽然间有一种醍醐灌顶的感觉,我整个后半生的美好时光都将在寻找程序BUG中度过了”。肯定从那之后的大部分正常的码农都会同情Wilkes过分悲观的想法,虽然也许会有人困惑于他对软件开发的难度的天真看法。 diff --git a/ch12/ch12.md b/ch12/ch12.md index 56ecb19..9c61b6b 100644 --- a/ch12/ch12.md +++ b/ch12/ch12.md @@ -1,4 +1,4 @@ -# 第十二章 反射 +# 第十二章 反射 Go语言提供了一种机制,能够在运行时更新变量和检查它们的值、调用它们的方法和它们支持的内在操作,而不需要在编译时就知道这些变量的具体类型。这种机制被称为反射。反射也可以让我们将类型本身作为第一类的值类型处理。 diff --git a/ch13/ch13-01.md b/ch13/ch13-01.md index 2d84752..f4add59 100644 --- a/ch13/ch13-01.md +++ b/ch13/ch13-01.md @@ -14,18 +14,18 @@ Sizeof函数返回的大小只包括数据结构中固定的部分,例如字 由于地址对齐这个因素,一个聚合类型(结构体或数组)的大小至少是所有字段或元素大小的总和,或者更大因为可能存在内存空洞。内存空洞是编译器自动添加的没有被使用的内存空间,用于保证后面每个字段或元素的地址相对于结构或数组的开始地址能够合理地对齐(译注:内存空洞可能会存在一些随机数据,可能会对用unsafe包直接操作内存的处理产生影响)。 -类型 | 大小 ------------------------------ | ---- -bool | 1个字节 -intN, uintN, floatN, complexN | N/8个字节(例如float64是8个字节) -int, uint, uintptr | 1个机器字 -*T | 1个机器字 -string | 2个机器字(data,len) -[]T | 3个机器字(data,len,cap) -map | 1个机器字 -func | 1个机器字 -chan | 1个机器字 -interface | 2个机器字(type,value) +类型 | 大小 +------------------------------- | ----------------------------- +`bool` | 1个字节 +`intN, uintN, floatN, complexN` | N/8个字节(例如float64是8个字节) +`int, uint, uintptr` | 1个机器字 +`*T` | 1个机器字 +`string` | 2个机器字(data,len) +`[]T` | 3个机器字(data,len,cap) +`map` | 1个机器字 +`func` | 1个机器字 +`chan` | 1个机器字 +`interface` | 2个机器字(type,value) Go语言的规范并没有要求一个字段的声明顺序和内存中的顺序是一致的,所以理论上一个编译器可以随意地重新排列每个字段的内存位置,虽然在写作本书的时候编译器还没有这么做。下面的三个结构体虽然有着相同的字段,但是第一种写法比另外的两个需要多50%的内存。 diff --git a/ch13/ch13.md b/ch13/ch13.md index ac8dece..620a90d 100644 --- a/ch13/ch13.md +++ b/ch13/ch13.md @@ -1,4 +1,4 @@ -# 第十三章 底层编程 +# 第十三章 底层编程 Go语言的设计包含了诸多安全策略,限制了可能导致程序运行出错的用法。编译时类型检查可以发现大多数类型不匹配的操作,例如两个字符串做减法的错误。字符串、map、slice和chan等所有的内置类型,都有严格的类型转换规则。 diff --git a/ch2/ch2.md b/ch2/ch2.md index e6aec8b..ca598b5 100644 --- a/ch2/ch2.md +++ b/ch2/ch2.md @@ -1,5 +1,5 @@ -# 第二章 程序结构 +# 第二章 程序结构 Go语言和其他编程语言一样,一个大的程序是由很多小的基础构件组成的。变量保存值,简单的加法和减法运算被组合成较复杂的表达式。基础类型被聚合为数组或结构体等更复杂的数据结构。然后使用if和for之类的控制语句来组织和控制表达式的执行流程。然后多个语句被组织到一个个函数中,以便代码的隔离和复用。函数以源文件和包的方式被组织。 -我们已经在前面章节的例子中看到了很多例子。在本章中,我们将深入讨论Go程序基础结构方面的一些细节。每个示例程序都是刻意写的简单,这样我们可以减少复杂的算法或数据结构等不相关的问题带来的干扰,从而可以专注于Go语言本身的学习。 +我们已经在前面章节的例子中看到了很多例子。在本章中,我们将深入讨论Go程序基础结构方面的一些细节。每个示例程序都是刻意写的简单,这样我们可以减少复杂的算法或数据结构等不相关的问题带来的干扰,从而可以专注于Go语言本身的学习。 diff --git a/ch3/ch3.md b/ch3/ch3.md index 4fa6033..2e24065 100644 --- a/ch3/ch3.md +++ b/ch3/ch3.md @@ -1,4 +1,4 @@ -# 第三章 基础数据类型 +# 第三章 基础数据类型 虽然从底层而言,所有的数据都是由比特组成,但计算机一般操作的是固定大小的数,如整数、浮点数、比特数组、内存地址等。进一步将这些数组织在一起,就可表达更多的对象,例如数据包、像素点、诗歌,甚至其他任何对象。Go语言提供了丰富的数据组织形式,这依赖于Go语言内置的数据类型。这些内置的数据类型,兼顾了硬件的特性和表达复杂数据结构的便捷性。 diff --git a/ch4/ch4.md b/ch4/ch4.md index 48bfbd9..6a20692 100644 --- a/ch4/ch4.md +++ b/ch4/ch4.md @@ -1,4 +1,4 @@ -# 第四章 复合数据类型 +# 第四章 复合数据类型 在第三章我们讨论了基本数据类型,它们可以用于构建程序中数据结构,是Go语言的世界的原子。在本章,我们将讨论复合数据类型,它是以不同的方式组合基本类型可以构造出来的复合数据类型。我们主要讨论四种类型——数组、slice、map和结构体——同时在本章的最后,我们将演示如何使用结构体来解码和编码到对应JSON格式的数据,并且通过结合使用模板来生成HTML页面。 diff --git a/ch5/ch5.md b/ch5/ch5.md index 67d76dd..bb41c6e 100644 --- a/ch5/ch5.md +++ b/ch5/ch5.md @@ -1,4 +1,4 @@ -# 第五章 函数 +# 第五章 函数 函数可以让我们将一个语句序列打包为一个单元,然后可以从程序中其它地方多次调用。函数的机制可以让我们将一个大的工作分解为小的任务,这样的小任务可以让不同程序员在不同时间、不同地方独立完成。一个函数同时对用户隐藏了其实现细节。由于这些因素,对于任何编程语言来说,函数都是一个至关重要的部分。 diff --git a/ch6/ch6.md b/ch6/ch6.md index 4d37c6a..a339aa8 100644 --- a/ch6/ch6.md +++ b/ch6/ch6.md @@ -1,4 +1,4 @@ -# 第六章 方法 +# 第六章 方法 从90年代早期开始,面向对象编程(OOP)就成为了称霸工程界和教育界的编程范式,所以之后几乎所有大规模被应用的语言都包含了对OOP的支持,go语言也不例外。 diff --git a/ch7/ch7.md b/ch7/ch7.md index 9f95413..3e1de62 100644 --- a/ch7/ch7.md +++ b/ch7/ch7.md @@ -1,4 +1,4 @@ -# 第七章 接口 +# 第七章 接口 接口类型是对其它类型行为的抽象和概括;因为接口类型不会和特定的实现细节绑定在一起,通过这种抽象的方式我们可以让我们的函数更加灵活和更具有适应能力。 diff --git a/ch8/ch8.md b/ch8/ch8.md index 224664a..0e613e9 100644 --- a/ch8/ch8.md +++ b/ch8/ch8.md @@ -1,4 +1,4 @@ -# 第八章 Goroutines和Channels +# 第八章 Goroutines和Channels 并发程序指同时进行多个任务的程序,随着硬件的发展,并发程序变得越来越重要。Web服务器会一次处理成千上万的请求。平板电脑和手机app在渲染用户画面同时还会后台执行各种计算任务和网络请求。即使是传统的批处理问题--读取数据,计算,写输出--现在也会用并发来隐藏掉I/O的操作延迟以充分利用现代计算机设备的多个核心。计算机的性能每年都在以非线性的速度增长。 diff --git a/ch9/ch9.md b/ch9/ch9.md index c99447f..caee18f 100644 --- a/ch9/ch9.md +++ b/ch9/ch9.md @@ -1,4 +1,4 @@ -# 第九章 基于共享变量的并发 +# 第九章 基于共享变量的并发 前一章我们介绍了一些使用goroutine和channel这样直接而自然的方式来实现并发的方法。然而这样做我们实际上屏蔽掉了在写并发代码时必须处理的一些重要而且细微的问题。