This commit is contained in:
Akagi201 2016-04-02 20:16:43 +08:00
parent 9c09780040
commit ec232f536e
4 changed files with 13 additions and 18 deletions

View File

@ -2,15 +2,14 @@
所有的编程语言都反映了语言设计者对编程哲学的反思通常包括之前的语言所暴露的一些不足地方的改进。Go项目是在Google公司维护超级复杂的几个软件系统遇到的一些问题的反思但是这类问题绝不是Google公司所特有的
正如[Rob Pike](http://genius.cat-v.org/rob-pike/)所说,“软件的复杂性是乘法级相关的”,通过增加一个部分的复杂性来修复问题通常将慢慢地增加其他部分的复杂性。通过增加功能选项和配置是修复问题的最快的途径,但是这很容易让人忘记简洁的内涵,即使从长远来看,简洁依然是好软件的关键因素。
正如[Rob Pike](http://genius.cat-v.org/rob-pike/)所说,“软件的复杂性是乘法级相关的”,通过增加一个部分的复杂性来修复问题通常将慢慢地增加其他部分的复杂性。通过增加功能选项和配置是修复问题的最快的途径,但是这很容易让人忘记简洁的内涵,即从长远来看,简洁依然是好软件的关键因素。
简洁的设计需要在工作开始的时候舍弃不必要的想法,并且在软件的生命周期内严格区别好的改变坏的改变。通过足够的努力,一个好的改变可以在不破坏原有完整概念的前提下保持自适应,正如[Fred Brooks](http://www.cs.unc.edu/~brooks/)所说的“概念完整性”;而一个坏的改变则不能达到这个效果,它们仅仅是通过肤浅的和简单的妥协来破坏原有设计的一致性。只有通过简洁的设计,才能让一个系统保持稳定、安全和持续的进化。
简洁的设计需要在工作开始的时候舍弃不必要的想法,并且在软件的生命周期内严格区别好的改变坏的改变。通过足够的努力,一个好的改变可以在不破坏原有完整概念的前提下保持自适应,正如[Fred Brooks](http://www.cs.unc.edu/~brooks/)所说的“概念完整性”;而一个坏的改变则不能达到这个效果,它们仅仅是通过肤浅的和简单的妥协来破坏原有设计的一致性。只有通过简洁的设计,才能让一个系统保持稳定、安全和持续的进化。
Go项目包括编程语言本身附带了相关的工具和标准库最后但并非代表不重要的关于简洁编程哲学的宣言。就事后诸葛的角度来看Go语言的这些地方都做的还不错拥有自动垃圾回收、一个包系统、函数作为一等公民、词法作用域、系统调用接口、只读的UTF8字符串等。但是Go语言本身只有很少的特性也不太可能添加太多的特性。例如它没有隐式的数值转换没有构造函数和析构函数没有运算符重载没有默认参数也没有继承没有泛型没有异常没有宏没有函数修饰更没有线程局部存储。但是语言本身是成熟和稳定的而且承诺保证向后兼容用之前的Go语言编写程序可以用新版本的Go语言编译器和标准库直接构建而不需要修改代码。
Go项目包括编程语言本身附带了相关的工具和标准库最后但并非代表不重要的关于简洁编程哲学的宣言。就事后诸葛的角度来看Go语言的这些地方都做的还不错拥有自动垃圾回收、一个包系统、函数作为一等公民、词法作用域、系统调用接口、只读的UTF8字符串等。但是Go语言本身只有很少的特性也不太可能添加太多的特性。例如它没有隐式的数值转换没有构造函数和析构函数没有运算符重载没有默认参数也没有继承没有泛型没有异常没有宏没有函数修饰更没有线程局部存储。但是语言本身是成熟和稳定的而且承诺保证向后兼容用之前的Go语言编写程序可以用新版本的Go语言编译器和标准库直接构建而不需要修改代码。
Go语言有足够的类型系统以避免动态语言中那些粗心的类型错误但是Go语言的类型系统相比传统的强类型语言又要简洁很多。虽然有时候这会导致一个“无类型”的抽象类型概念但是Go语言程序员并不需要像C++或Haskell程序员那样纠结于具体类型的安全属性。在实践中Go语言简洁的类型系统给程序员带来了更多的安全性和更好的运行时性能。
Go语言有足够的类型系统以避免动态语言中那些粗心的类型错误但是Go语言的类型系统相比传统的强类型语言又要简洁很多。虽然有时候这会导致一个“无类型”的抽象类型概念但是Go语言程序员并不需要像C++或Haskell程序员那样纠结于具体类型的安全属性。在实践中Go语言简洁的类型系统给程序员带来了更多的安全性和更好的运行时性能。
Go语言鼓励当代计算机系统设计的原则特别是局部的重要性。它的内置数据类型和大多数的准库数据结构都经过精心设计而避免显式的初始化或隐式的构造函数因为很少的内存分配和内存初始化代码被隐藏在库代码中了。Go语言的聚合类型结构体和数组可以直接操作它们的元素只需要更少的存储空间、更少的内存分配而且指针操作比其他间接操作的语言也更有效率。由于现代计算机是一个并行的机器Go语言提供了基于CSP的并发特性支持。Go语言的动态栈使得轻量级线程goroutine的初始栈可以很小因此创建一个goroutine的代价很小创建百万级的goroutine完全是可行的。
Go语言的标准库通常被称为语言自带的电池提供了清晰的构建模块和公共接口包含I/O操作、文本处理、图像、密码学、网络和分布式应用程序等并支持许多标准化的文件格式和编解码协议。库和工具使用了大量的约定来减少额外的配置和解释从而最终简化程序的逻辑而且每个Go程序结构都是如此的相似因此Go程序也很容易学习。使用Go语言自带工具构建Go语言项目只需要使用文件名和标识符名称, 一个偶尔的特殊注释来确定所有的库、可执行文件、测试、基准测试、例子、以及特定于平台的变量、项目的文档等Go语言源代码本身就包含了构建规范。
Go语言鼓励当代计算机系统设计的原则特别是局部的重要性。它的内置数据类型和大多数的准库数据结构都经过精心设计而避免显式的初始化或隐式的构造函数因为很少的内存分配和内存初始化代码被隐藏在库代码中了。Go语言的聚合类型结构体和数组可以直接操作它们的元素只需要更少的存储空间、更少的内存分配而且指针操作比其他间接操作的语言也更有效率。由于现代计算机是一个并行的机器Go语言提供了基于CSP的并发特性支持。Go语言的动态栈使得轻量级线程goroutine的初始栈可以很小因此创建一个goroutine的代价很小创建百万级的goroutine完全是可行的。
Go语言的标准库通常被称为语言自带的电池提供了清晰的构建模块和公共接口包含I/O操作、文本处理、图像、密码学、网络和分布式应用程序等并支持许多标准化的文件格式和编解码协议。库和工具使用了大量的约定来减少额外的配置和解释从而最终简化程序的逻辑而且每个Go程序结构都是如此的相似因此Go程序也很容易学习。使用Go语言自带工具构建Go语言项目只需要使用文件名和标识符名称, 一个偶尔的特殊注释来确定所有的库、可执行文件、测试、基准测试、例子、以及特定于平台的变量、项目的文档等Go语言源代码本身就包含了构建规范。

View File

@ -1,18 +1,18 @@
## 本书的组织
我们假设你已经有一种或多种其他编程语言的使用经历不管是类似C、c++或Java的编译型语言还是类似Python、Ruby、JavaScript的脚本语言因此我们不会像对完全的编程语言初学者那样解释所有的细节。因为Go语言的变量、常量、表达式、控制流和函数等基本语法也是类似的。
我们假设你已经有一种或多种其他编程语言的使用经历不管是类似C、C++或Java的编译型语言还是类似Python、Ruby、JavaScript的脚本语言因此我们不会像对完全的编程语言初学者那样解释所有的细节。因为Go语言的变量、常量、表达式、控制流和函数等基本语法也是类似的。
第一章包含了本教程的基本结构通过十几个程序介绍了用Go语言如何实现 类似读写文件、文本格式化、创建图像、网络客户端和服务器通讯等日常工作。
第一章包含了本教程的基本结构通过十几个程序介绍了用Go语言如何实现类似读写文件、文本格式化、创建图像、网络客户端和服务器通讯等日常工作。
第二章描述了Go语言程序的基本元素结构、变量、新类型定义、包和文件、以及作用域概念。第三章讨论了数字、布尔值、字符串和常量并演示了如何显示和处理Unicode字符。第四章描述了复合类型从简单的数组、字典、切片到动态列表。第五章涵盖了函数并讨论了错误处理、panic和recover还有defer语句。
第二章描述了Go语言程序的基本元素结构、变量、新类型定义、包和文件、以及作用域概念。第三章讨论了数字、布尔值、字符串和常量并演示了如何显示和处理Unicode字符。第四章描述了复合类型从简单的数组、字典、切片到动态列表。第五章涵盖了函数并讨论了错误处理、panic和recover还有defer语句。
第一章到第五章是基础部分主流命令式编程语言这部分都类似。个别之处Go语言有自己特色的语法和风格但是大多数程序员能很快适应。其余章节是Go语言特有的方法、接口、并发、包、测试和反射等语言特性。
Go语言的面向对象机制与一般语言不同。它没有类层次结构甚至可以说没有类仅仅通过组合而不是继承简单的对象来构建复杂的对象。方法不仅可以定义在结构体上, 而且可以定义在任何用户自定义的类型上;并且具体类型和抽象类型(接口)之间的关系是隐式的,所以很多类型的设计者可能并不知道该类型到底实现了哪些接口。方法在第六章讨论,接口在第七章讨论。
Go语言的面向对象机制与一般语言不同。它没有类层次结构甚至可以说没有类仅仅通过组合而不是继承简单的对象来构建复杂的对象。方法不仅可以定义在结构体上, 而且, 可以定义在任何用户自定义的类型上;并且, 具体类型和抽象类型(接口)之间的关系是隐式的,所以很多类型的设计者可能并不知道该类型到底实现了哪些接口。方法在第六章讨论,接口在第七章讨论。
第八章讨论了基于顺序通信进程(CSP)概念的并发编程使用goroutines和channels处理并发编程。第九章则讨论了传统的基于共享变量的并发编程。
第十章描述了包机制和包的组织结构。这一章还展示了如何有效利用Go自带的工具使用单个命令完成编译、测试、基准测试、代码格式化、文档以及其他诸多任务。
第十章描述了包机制和包的组织结构。这一章还展示了如何有效利用Go自带的工具使用单个命令完成编译、测试、基准测试、代码格式化、文档以及其他诸多任务。
第十一章讨论了单元测试Go语言的工具和标准库中集成了轻量级的测试功能避免了强大但复杂的测试框架。测试库提供了一些基本构件必要时可以用来构建复杂的测试构件。
@ -39,4 +39,3 @@ go version go1.5 linux/amd64
```
如果使用其他的操作系统, 请参考 https://golang.org/doc/install 提供的说明安装。

View File

@ -10,5 +10,4 @@ Playground可以简单的通过执行一个小程序来测试对语法、语义
当然Playground 和 Tour 也有一些限制它们只能导入标准库而且因为安全的原因对一些网络库做了限制。如果要在编译和运行时需要访问互联网对于一些更复杂的实验你可能需要在自己的电脑上构建并运行程序。幸运的是下载Go语言的过程很简单从 https://golang.org 下载安装包应该不超过几分钟译注感谢伟大的长城让大陆的Gopher们都学会了自己打洞的基本生活技能下载时间可能会因为洞的大小等因素从几分钟到几天或更久然后就可以在自己电脑上编写和运行Go程序了。
Go语言是一个开源项目你可以在 https://golang.org/pkg 阅读标准库中任意函数和类型的实现代码,和下载安装包的代码完全一致。这样你可以知道很多函数是如何工作的, 通过挖掘找出一些答案的细节或者仅仅是出于欣赏专业级Go代码。
Go语言是一个开源项目你可以在 https://golang.org/pkg 阅读标准库中任意函数和类型的实现代码,和下载安装包的代码完全一致。这样,你可以知道很多函数是如何工作的, 通过挖掘找出一些答案的细节或者仅仅是出于欣赏专业级Go代码。

View File

@ -4,12 +4,10 @@
我们还感谢Sameer Ajmani、Ittai Balaban、David Crawshaw、Billy Donohue、Jonathan Feinberg、Andrew Gerrand、Robert Griesemer、John Linderman、Minux Ma译注中国人Go团队成员。、Bryan Mills、Bala Natarajan、Cosmos Nicolaou、Paul Staniforth、Nigel Tao译注好像是陶哲轩的兄弟以及Howard Trickey给出的许多有价值的建议。我们还要感谢David Brailsford和Raph Levien关于类型设置的建议。
我们来自Addison-Wesley的编辑Greg Doench收到了很多帮助从最开始就得到了越来越多的帮助。来自AW生产团队的John Fuller、Dayna Isley、Julie Nahil、Chuti Prasertsith到Barbara Wood感谢你们的热心帮助。
我们来自Addison-Wesley的编辑Greg Doench收到了很多帮助从最开始就得到了越来越多的帮助。来自AW生产团队的John Fuller、Dayna Isley、Julie Nahil、Chuti Prasertsith到Barbara Wood感谢你们的热心帮助。
[Alan Donovan](https://github.com/adonovan)特别感谢Sameer Ajmani、Chris Demetriou、Walt Drummond和Google公司的Reid Tatge允许他有充裕的时间去写本书感谢Stephen Donovan的建议和始终如一的鼓励以及他的妻子Leila Kazemi并没有让他为了家庭琐事而分心并热情坚定地支持这个项目。
[Brian Kernighan](http://www.cs.princeton.edu/~bwk/)特别感谢朋友和同事对他的耐心和宽容让他慢慢地梳理本书的写作思路。同时感谢他的妻子Meg和其他很多朋友对他写作事业的支持。
2015年 10月 于 纽约