mirror of
https://github.com/unknwon/the-way-to-go_ZH_CN.git
synced 2025-08-11 19:41:43 +08:00
format adjusting
This commit is contained in:
78
README.md
78
README.md
@@ -1,39 +1,39 @@
|
||||
《Go入门指南》
|
||||
===================
|
||||
|
||||
在接触 Go 语言之后,对这门编程语言非常着迷,期间也陆陆续续开始一些帮助国内编程爱好者了解和发展 Go 语言的工作,比如开始录制视频教程[《Go编程基础》](https://github.com/Unknwon/go-fundamental-programming)。但由于目前国内并没有比较好的 Go 语言书籍,而国外的优秀书籍因为英文的缘故在一定程度上也为不少 Go 语言爱好者带来了一些学习上的困扰,不仅为了加快扩散 Go 爱好者的国内群体,同时充分贯彻 [Asta谢](https://github.com/astaxie) 的为己为人精神,本人在完成阅读这本名叫《The Way to Go》之后,决定每天抽出一点时间来进行翻译的工作,并且以开源的形式免费分享给有需要的 Go 语言爱好者。
|
||||
|
||||
尽管该书对目前 Go 语言版本来说有小部分内容相对过时,但是为当下不可多得的好书,部分内容已获得作者同意根据当前 Go 语言版本进行修改。
|
||||
|
||||
该翻译版本已获得原作者(Ivo Balbaert)本人授权,并表示支持开源事业的发展!
|
||||
|
||||
##翻译进度
|
||||
[语言的主要特性与发展的环境和影响因素](eBook/01.2.md)
|
||||
|
||||
##支持本书
|
||||
如果你喜欢本书《Go 入门指南》,你可以参与到本书的翻译或纠正工作中来,一同完善本书并帮助壮大 Go 语言在国内的学习群体,给大家提供更好的学习资源。
|
||||
|
||||
##交流
|
||||
欢迎大家加入QQ群:259316004(不要被群名字迷惑了,这里牛人可多了)
|
||||
|
||||
Golang中文社区:[mygolang.com](http://mygolang.com)
|
||||
|
||||
Go语言学习园地:[studygolang.com](http://studygolang.com/)
|
||||
|
||||
Golang中国:[golang.tc](http://www.golang.tc/)
|
||||
|
||||
###新人守则
|
||||
- 2012 年 3 月 28 日以前的博文中的内容基本过时,不要再看
|
||||
- 符合等式 ***百度+思考+失败+翻墙+谷歌+尝试=解决*** 的问题最好不要发问
|
||||
- 不要问 Go 现在的发展前景如何
|
||||
- 不要问学习 Go 语言能不能找到工作
|
||||
- 不要问现在 Go 语言有哪些实际应用
|
||||
|
||||
##致谢
|
||||
- 本书原作者:Ivo Balbaert
|
||||
|
||||
##授权许可
|
||||
除特别声明外,本书中的内容使用[CC BY-SA 3.0 License](http://creativecommons.org/licenses/by-sa/3.0/)(创作共用 署名-相同方式共享0 许可协议)授权,代码遵循[BSD 3-Clause License](https://github.com/astaxie/build-web-application-with-golang/blob/master/LICENSE.md)(3 项条款的 BSD 许可协议)。
|
||||
|
||||
##开始阅读
|
||||
[前言](./eBook/preface.md)
|
||||
《Go入门指南》
|
||||
===================
|
||||
|
||||
在接触 Go 语言之后,对这门编程语言非常着迷,期间也陆陆续续开始一些帮助国内编程爱好者了解和发展 Go 语言的工作,比如开始录制视频教程[《Go编程基础》](https://github.com/Unknwon/go-fundamental-programming)。但由于目前国内并没有比较好的 Go 语言书籍,而国外的优秀书籍因为英文的缘故在一定程度上也为不少 Go 语言爱好者带来了一些学习上的困扰,不仅为了加快扩散 Go 爱好者的国内群体,同时充分贯彻 [Asta谢](https://github.com/astaxie) 的为己为人精神,本人在完成阅读这本名叫《The Way to Go》之后,决定每天抽出一点时间来进行翻译的工作,并且以开源的形式免费分享给有需要的 Go 语言爱好者。
|
||||
|
||||
尽管该书对目前 Go 语言版本来说有小部分内容相对过时,但是为当下不可多得的好书,部分内容已获得作者同意根据当前 Go 语言版本进行修改。
|
||||
|
||||
该翻译版本已获得原作者(Ivo Balbaert)本人授权,并表示支持开源事业的发展!
|
||||
|
||||
##翻译进度
|
||||
[语言的主要特性与发展的环境和影响因素](eBook/01.2.md)
|
||||
|
||||
##支持本书
|
||||
如果你喜欢本书《Go入门指南》,你可以参与到本书的翻译或纠正工作中来,一同完善本书并帮助壮大 Go 语言在国内的学习群体,给大家提供更好的学习资源。
|
||||
|
||||
##交流
|
||||
欢迎大家加入QQ群:259316004(不要被群名字迷惑了,这里牛人可多了)
|
||||
|
||||
Golang中文社区:[mygolang.com](http://mygolang.com)
|
||||
|
||||
Go语言学习园地:[studygolang.com](http://studygolang.com/)
|
||||
|
||||
Golang中国:[golang.tc](http://www.golang.tc/)
|
||||
|
||||
###新人守则
|
||||
- 2012 年 3 月 28 日以前的博文中的内容基本过时,不要再看
|
||||
- 符合等式 ***百度+思考+失败+翻墙+谷歌+尝试=解决*** 的问题最好不要发问
|
||||
- 不要问 Go 现在的发展前景如何
|
||||
- 不要问学习 Go 语言能不能找到工作
|
||||
- 不要问现在 Go 语言有哪些实际应用
|
||||
|
||||
##致谢
|
||||
- 本书原作者:Ivo Balbaert
|
||||
|
||||
##授权许可
|
||||
除特别声明外,本书中的内容使用 [CC BY-SA 3.0 License](http://creativecommons.org/licenses/by-sa/3.0/)(创作共用 署名-相同方式共享0 许可协议)授权,代码遵循 [BSD 3-Clause License](https://github.com/astaxie/build-web-application-with-golang/blob/master/LICENSE.md)(3 项条款的 BSD 许可协议)。
|
||||
|
||||
##开始阅读
|
||||
[前言](./eBook/preface.md)
|
||||
|
276
eBook/01.2.md
276
eBook/01.2.md
@@ -1,138 +1,138 @@
|
||||
#1.2 语言的主要特性与发展的环境和影响因素
|
||||
##1.2.1 影响 Go 语言发展的早期编程语言
|
||||
正如“21 世界的 C 语言”这句话所说,Go 语言并不是凭空而造的,而是和 C++、Java 和 C# 一样属于 C 系。不仅如此,设计者们还汲取了其它编程语言的精粹部分融入到 Go 语言当中。
|
||||
|
||||
在声明和包的设计方面,Go 语言受到 Pascal、Modula 和 Oberon 系语言的影响;在并发原理的设计上,Go 语言从同样受到 Tony Hoare 的 CSP(通信序列进程 *Communicating Squential Processes*)理论影响的 Limbo 和 Newsqueak 的实践中借鉴了一些经验,并使用了和 Erlang 类似的机制。
|
||||
|
||||
这是一门完全开源的编程语言,因为它使用 BSD 授权许可,所以任何人都可以进行商业软件的开发而不需要支付任何费用。
|
||||
|
||||
尽管为了能够让目前主流的开发者们能够对 Go 语言中的类 C 语言的语法感到非常亲切而易于转型,但是它在极大程度上简化了这些语法,使得它们比 C/C++ 的语法更加简洁和干净。同时,Go 语言也拥有一些动态语言的特性,这使得使用 Python 和 Ruby 的开发者们在使用 Go 语言的时候感觉非常容易上手。
|
||||
|
||||
下图展示了一些其它编程语言对Go语言的影响:
|
||||
|
||||

|
||||
|
||||
图1.3 其它编程语言对 Go 语言的影响
|
||||
|
||||
##1.2.2 为什么要创造一门编程语言
|
||||
- C/C++的发展速度无法跟上计算机发展的脚步,十多年来也没有出现一门与时代相符的主流系统编程语言,因此人们需要一门新的系统编程语言来弥补这个空缺,尤其是在计算机信息时代。
|
||||
- 对比计算机性能的提升,软件开发领域不被认为发展地足够快或者比硬件发展更加成功(有许多项目均以失败告终),同时应用程序的体积始终在不断地扩大,这就迫切地需要一门具备更高层次概念的低级语言来突破现状。
|
||||
- 在 Go 语言出现之前,开发者们总是面临非常艰难的抉择,究竟是使用执行速度快但是编译速度并不理想的语言(如:C++),还是使用编译速度较快但执行效率不佳的语言(如:.NET、Java),或者说开发难度较低但执行速度一般的动态语言呢?显然,Go 语言在这 3 个条件之间做到了最佳的平衡:快速编译,高效执行,易于开发。
|
||||
|
||||
##1.2.3 Go 语言的发展目标
|
||||
Go 语言的主要目标是将静态语言的安全性和高效性与动态语言的易开发性进行有机结合,达到完美平衡,从而使编程变得更加有乐趣,而不是在艰难抉择中痛苦前行。
|
||||
|
||||
因此,Go 语言是一门类型安全和内存安全的编程语言。虽然 Go 语言中仍有指针的存在,但并不允许进行指针运算。
|
||||
|
||||
Go 语言的另一个目标是对于网络通信,并发和并行编程的极佳支持,从而更好地利用大量的分布式和多核的计算机,这一点对于谷歌内部的使用来说就非常重要了。设计者通过 goroutine 这种轻量级线程的概念来实现这个目标,然后通过 channel 来实现各个 goroutine 之间的通信。他们实现了分段栈增长和 goroutine 在线程基础上多路复用技术的自动化。
|
||||
|
||||
这个特性显然是 Go 语言最强有力的部分,不仅支持了日益重要的多核与多处理器计算机,也弥补了现存编程语言在这方面所存在的不足。
|
||||
|
||||
Go 语言中另一个非常重要的特性就是它的构建速度(编译和链接到机器代码的速度),一般情况下构建一个程序的时间只需要数百毫秒到几秒。作为大量使用 C++ 来构建基础设施的谷歌来说,无疑从根本上摆脱了 C++ 在构建速度上非常不理想的噩梦。这不仅极大地提升了开发者的生产力,同时也使得软件开发过程中的代码测试环节更加紧凑,而不必浪费大量的时间在等待程序的构建上。
|
||||
|
||||
依赖管理是现今软件开发的一个重要组成部分,但是 C 语言中“头文件”的概念却导致越来越多因为依赖关系而使得构建一个大型的项目需要长达几个小时的时间。人们越来越需要一门具有严格的、简洁的依赖关系分析系统从而能够快速编译的编程语言。这正是 Go 语言采用包模型的根本原因,这个模型通过严格的依赖关系检查机制来加快程序构建的速度,提供了非常好的可量测性。
|
||||
|
||||
整个 Go 语言标准库的编译时间一般都在 20 秒以内,其它的常规项目也只需要半秒钟的时间来完成编译工作。这种闪电般的编译速度甚至比编译 C 语言或者 Fortran 更加快,使得编译这一环节不再成为在软件开发中困扰开发人员的问题。在这之前,动态语言将快速编译作为自身的一大亮点,像 C++ 那样的静态语言一般都有非常漫长的编译和链接工作。而同样作为静态语言的 Go 语言,通过自身优良的构建机制,成功地了去除了这个弊端,使得程序的构建过程变得微不足道,拥有了像脚本语言和动态语言那样的高效开发的能力。
|
||||
|
||||
另外,Go 语言在执行速度方面也可以与 C/C++ 相提并论。
|
||||
|
||||
由于内存问题(通常称为内存泄漏)长期以来一直伴随着 C++ 的开发者们,Go 语言的设计者们认为内存管理不应该是开发人员所需要考虑的问题。因此尽管 Go 语言像其它静态语言一样执行本地代码,但它依旧运行在某种意义上的虚拟机,以此来实现高效快速的垃圾回收(使用了一个简单的标记-清除算法)。
|
||||
|
||||
尽管垃圾回收并不容易实现,但考虑这将是未来并发应用程序发展的一个重要组成部分,Go 语言的设计者们还是完成了这项艰难的任务。
|
||||
|
||||
Go 语言还能够在运行时进行反射相关的操作。
|
||||
|
||||
使用 `go install` 能够很轻松地对第三方包进行部署。
|
||||
|
||||
此外,Go 语言还支持调用由 C 语言编写的海量库文件(第3.9节),从而能够将过去开发的软件进行快速迁移。
|
||||
|
||||
##1.2.4 指导设计原则
|
||||
Go语言通过减少关键字的数量(25 个)来简化编码过程中的混乱和复杂度。干净、整齐和简洁的语法也能够提高程序的编译速度,因为这些关键字在编译过程中少到甚至不需要符号表来协助解析。
|
||||
|
||||
这些方面的工作都是为了减少编码的工作量,甚至可以与 Java 的简化程度相比较。
|
||||
|
||||
Go 语言有一种极简抽象艺术家的感觉,因为它只提供了一到两种方法来解决某个问题,这使得开发者们的代码都非常容易阅读和理解。众所周知,代码的可读性是软件工程里最重要的一部分( ***译者注:代码是写给人看的,不是写给机器看的*** )。
|
||||
|
||||
这些设计理念没有建立其它概念之上,所以并不会因为牵扯到一些概念而将某个概念复杂化,他们之间是相互独立的。
|
||||
|
||||
Go 语言有一套完整的编码规范,你可以在 [Go 语言编码规范](http://golang.org/doc/go_spec.html) 页面进行查看。
|
||||
|
||||
它不像 Ruby 那样通过实现过程来定义编码规范。作为一门具有明确编码规范的语言,它要求可以采用不同的编译器如 gc 和 gccgo(第 2.1 节)进行编译工作,这对语言本身拥有更好的编码规范起到很大帮助。
|
||||
|
||||
[LALR](http://en.wikipedia.org/wiki/LALR_parser) 是 Go 语言的语法标准,你也可以在 `src/cmd/gc/go.y` 中查看到,这种语法标准在编译时不需要符号表来协助解析。
|
||||
|
||||
##1.2.5 语言的特性
|
||||
Go 语言从本质上(程序和结构方面)来实现并发编程。
|
||||
|
||||
因为 Go 语言没有类和继承的概念,所以它和 Java 或 C++ 看起来并不相同。但是它通过接口(interface)的概念来实现多态性。Go 语言有一个清晰易懂的轻量级类型系统,在类型之间也没有层级之说。因此可以说这是一门混合型的语言。
|
||||
|
||||
在传统的面向对象语言中,使用面向对象编程技术显得非常的臃肿,它们总是通过复杂的模式来构建庞大的类型层级,这违背了编程语言应该提升生产力的宗旨。
|
||||
|
||||
函数是 Go 语言中的基本构件,它们的使用方法非常灵活。在第六章,我们会看到 Go 语言在函数式编程方面的基本概念。
|
||||
|
||||
Go 语言使用静态类型,所以它是类型安全的一门语言,加上通过构建到本地代码,程序的执行速度也非常快。
|
||||
|
||||
作为强类型语言,隐式的类型转换是不被允许的,记住一条原则:让所有的东西都是显式的。
|
||||
|
||||
Go 语言其实也有一些动态语言的特性(通过关键字 `var`),所以它对那些逃离 Java 和 .Net 世界而使用 Python、Ruby、PHP 和 JavaScript 的开发者们也具有很大的吸引力。
|
||||
|
||||
Go 语言支持交叉编译,比如说你可以在运行 Linux 系统的计算机上开发运行下 Windows 下运行的应用程序。这是第一门完全支持 UTF-8 的编程语言( ***译者注:.NET好像也支持吧?*** ),这不仅体现在它可以处理使用 UTF-8 编码的字符串,就连它的源码文件格式都是使用的 UTF-8 编码。Go 语言做到了真正的国际化!
|
||||
|
||||
##1.2.6 语言的用途
|
||||
Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过了。
|
||||
|
||||
Go 语言一个非常好的目标就是实现所谓的复杂事件处理([CEP](http://en.wikipedia.org/wiki/Complex_event_processing)),这项技术要求海量并行支持,高度的抽象化和高性能。当我们进入到物联网时代,CEP 必然会成为人们关注的焦点。
|
||||
|
||||
但是 Go 语言同时也是一门可以用于实现一般目标的语言,例如对于文本的处理,前端展现,甚至像使用脚本一样使用它。
|
||||
|
||||
值得注意的是,因为垃圾回收和自动内存分配的原因,Go 语言不适合用来开发对实时性要求很高的软件。
|
||||
|
||||
越来越多的谷歌内部的大型分布式应用程序都开始使用 Go 语言来开发,例如谷歌地球的一部分代码就是由 Go 语言完成的。
|
||||
|
||||
如果你想知道一些其它组织使用Go语言开发的实际应用项目,你可以到这个页面进行查看:[http://go-lang.cat-v.org/organizations-using-go](http://go-lang.cat-v.org/organizations-using-go)。出于隐私保护的考虑,许多公司的项目都没有展示在这个页面。我们将会在第 21 章讨论到一个使用 Go 语言开发的大型存储区域网络(SAN)案例。
|
||||
|
||||
在 Chrome 浏览器中内置了一款 Go 语言的编译器用于本地客户端(NaCl( ***为什么我觉得这是"钠"?*** )),这很可能会被用于在 Chrome OS 中执行 Go 语言开发的应用程序。
|
||||
|
||||
Go 语言可以在 Inter 或 ARM 处理器上运行,因此它也可以在安卓系统下运行,例如 Nexus 系列的产品。
|
||||
|
||||
在 Google App Engine 中使用 Go 语言:2011年5月5日,官方发布了用于开发运行在 Google App Engine 上的 Web 应用的 Go SDK,在此之前,开发者们只能选择使用 Python 或者 Java。这主要是 David Symonds 和 Nigel Tao 努力的成果。目前最新的稳定版是基于 r60.3 的SDK 1.6.1,于 2011 年 12 月 13 日发布。当前 Go 语言的稳定版本是 Go 1( ***译者注:目前最新的稳定版是Go1.1*** )。
|
||||
|
||||
##1.2.7 关于特性丢失
|
||||
许多能够在大多数面向对象语言中使用的特性 Go 语言都没有支持,但其中的一部分可能会在未来被支持。
|
||||
|
||||
- 为了简化设计,不支持函数重载和操作符重载
|
||||
- 为了避免在 C/C++ 开发中的一些 Bug 和混乱,不支持隐式转换
|
||||
- Go 语言通过另一种途径实现面向对象设计(第 10 - 11 章)来放弃类和类型的继承
|
||||
- 尽管在接口的使用方面(第 11 章)可以实现类似变体类型的功能,但本身不支持变体类型
|
||||
- 不支持动态加载代码
|
||||
- 不支持动态链接库
|
||||
- 不支持泛型
|
||||
- 通过 `recover` 和 `panic` 来替代异常机制(第 13.2 - 3 节)
|
||||
- 不支持断言
|
||||
- 不支持静态变量
|
||||
|
||||
关于 Go 语言开发团队对于这些方面的讨论,你可以通过这个页面查看:[http://golang.org/doc/go_faq.html](http://golang.org/doc/go_faq.html)
|
||||
|
||||
##1.2.8 使用 Go 语言编程
|
||||
如果你有其它语言的编程经历(面向对象编程语言,如:Java、C#、Object-C、Python、Ruby),在你进入到 Go 语言的世界之后,你将会像迷恋你的 X 语言一样无法自拔。Go 语言使用了与其它语言不同的设计模式,所以当你尝试将你的X语言的代码迁移到 Go 语言时,你将会非常失望,所以你需要从头开始,用 Go 的理念来思考。
|
||||
|
||||
如果你在至高点使用 Go 的理念来重新审视和分析一个问题,你通常会找到一个适用于 Go 语言的优雅的解决方案。
|
||||
|
||||
##1.2.9 小结
|
||||
这里列举一些 Go 语言的必杀技:
|
||||
|
||||
- 简化问题,易于学习
|
||||
- 内存管理,简洁语法,易于使用
|
||||
- 快速编译,高效开发
|
||||
- 高效执行
|
||||
- 并发支持,轻松驾驭
|
||||
- 静态类型
|
||||
- 标准类库,规范统一
|
||||
- 易于部署
|
||||
- 文档全面
|
||||
- 免费开源
|
||||
|
||||
##链接
|
||||
- [目录](directory.md)
|
||||
- 上一节:[起源与发展](01.1.md)
|
||||
- 下一章:[安装与运行环境](02.1.md)
|
||||
#1.2 语言的主要特性与发展的环境和影响因素
|
||||
##1.2.1 影响 Go 语言发展的早期编程语言
|
||||
正如“21 世界的 C 语言”这句话所说,Go 语言并不是凭空而造的,而是和 C++、Java 和 C# 一样属于 C 系。不仅如此,设计者们还汲取了其它编程语言的精粹部分融入到 Go 语言当中。
|
||||
|
||||
在声明和包的设计方面,Go 语言受到 Pascal、Modula 和 Oberon 系语言的影响;在并发原理的设计上,Go 语言从同样受到 Tony Hoare 的 CSP(通信序列进程 *Communicating Squential Processes*)理论影响的 Limbo 和 Newsqueak 的实践中借鉴了一些经验,并使用了和 Erlang 类似的机制。
|
||||
|
||||
这是一门完全开源的编程语言,因为它使用 BSD 授权许可,所以任何人都可以进行商业软件的开发而不需要支付任何费用。
|
||||
|
||||
尽管为了能够让目前主流的开发者们能够对 Go 语言中的类 C 语言的语法感到非常亲切而易于转型,但是它在极大程度上简化了这些语法,使得它们比 C/C++ 的语法更加简洁和干净。同时,Go 语言也拥有一些动态语言的特性,这使得使用 Python 和 Ruby 的开发者们在使用 Go 语言的时候感觉非常容易上手。
|
||||
|
||||
下图展示了一些其它编程语言对 Go 语言的影响:
|
||||
|
||||

|
||||
|
||||
图1.3 其它编程语言对 Go 语言的影响
|
||||
|
||||
##1.2.2 为什么要创造一门编程语言
|
||||
- C/C++的发展速度无法跟上计算机发展的脚步,十多年来也没有出现一门与时代相符的主流系统编程语言,因此人们需要一门新的系统编程语言来弥补这个空缺,尤其是在计算机信息时代。
|
||||
- 对比计算机性能的提升,软件开发领域不被认为发展地足够快或者比硬件发展更加成功(有许多项目均以失败告终),同时应用程序的体积始终在不断地扩大,这就迫切地需要一门具备更高层次概念的低级语言来突破现状。
|
||||
- 在 Go 语言出现之前,开发者们总是面临非常艰难的抉择,究竟是使用执行速度快但是编译速度并不理想的语言(如:C++),还是使用编译速度较快但执行效率不佳的语言(如:.NET、Java),或者说开发难度较低但执行速度一般的动态语言呢?显然,Go 语言在这 3 个条件之间做到了最佳的平衡:快速编译,高效执行,易于开发。
|
||||
|
||||
##1.2.3 Go 语言的发展目标
|
||||
Go 语言的主要目标是将静态语言的安全性和高效性与动态语言的易开发性进行有机结合,达到完美平衡,从而使编程变得更加有乐趣,而不是在艰难抉择中痛苦前行。
|
||||
|
||||
因此,Go 语言是一门类型安全和内存安全的编程语言。虽然 Go 语言中仍有指针的存在,但并不允许进行指针运算。
|
||||
|
||||
Go 语言的另一个目标是对于网络通信,并发和并行编程的极佳支持,从而更好地利用大量的分布式和多核的计算机,这一点对于谷歌内部的使用来说就非常重要了。设计者通过 goroutine 这种轻量级线程的概念来实现这个目标,然后通过 channel 来实现各个 goroutine 之间的通信。他们实现了分段栈增长和 goroutine 在线程基础上多路复用技术的自动化。
|
||||
|
||||
这个特性显然是 Go 语言最强有力的部分,不仅支持了日益重要的多核与多处理器计算机,也弥补了现存编程语言在这方面所存在的不足。
|
||||
|
||||
Go 语言中另一个非常重要的特性就是它的构建速度(编译和链接到机器代码的速度),一般情况下构建一个程序的时间只需要数百毫秒到几秒。作为大量使用 C++ 来构建基础设施的谷歌来说,无疑从根本上摆脱了 C++ 在构建速度上非常不理想的噩梦。这不仅极大地提升了开发者的生产力,同时也使得软件开发过程中的代码测试环节更加紧凑,而不必浪费大量的时间在等待程序的构建上。
|
||||
|
||||
依赖管理是现今软件开发的一个重要组成部分,但是 C 语言中“头文件”的概念却导致越来越多因为依赖关系而使得构建一个大型的项目需要长达几个小时的时间。人们越来越需要一门具有严格的、简洁的依赖关系分析系统从而能够快速编译的编程语言。这正是 Go 语言采用包模型的根本原因,这个模型通过严格的依赖关系检查机制来加快程序构建的速度,提供了非常好的可量测性。
|
||||
|
||||
整个 Go 语言标准库的编译时间一般都在 20 秒以内,其它的常规项目也只需要半秒钟的时间来完成编译工作。这种闪电般的编译速度甚至比编译 C 语言或者 Fortran 更加快,使得编译这一环节不再成为在软件开发中困扰开发人员的问题。在这之前,动态语言将快速编译作为自身的一大亮点,像 C++ 那样的静态语言一般都有非常漫长的编译和链接工作。而同样作为静态语言的 Go 语言,通过自身优良的构建机制,成功地了去除了这个弊端,使得程序的构建过程变得微不足道,拥有了像脚本语言和动态语言那样的高效开发的能力。
|
||||
|
||||
另外,Go 语言在执行速度方面也可以与 C/C++ 相提并论。
|
||||
|
||||
由于内存问题(通常称为内存泄漏)长期以来一直伴随着 C++ 的开发者们,Go 语言的设计者们认为内存管理不应该是开发人员所需要考虑的问题。因此尽管 Go 语言像其它静态语言一样执行本地代码,但它依旧运行在某种意义上的虚拟机,以此来实现高效快速的垃圾回收(使用了一个简单的标记-清除算法)。
|
||||
|
||||
尽管垃圾回收并不容易实现,但考虑这将是未来并发应用程序发展的一个重要组成部分,Go 语言的设计者们还是完成了这项艰难的任务。
|
||||
|
||||
Go 语言还能够在运行时进行反射相关的操作。
|
||||
|
||||
使用 `go install` 能够很轻松地对第三方包进行部署。
|
||||
|
||||
此外,Go 语言还支持调用由 C 语言编写的海量库文件(第3.9节),从而能够将过去开发的软件进行快速迁移。
|
||||
|
||||
##1.2.4 指导设计原则
|
||||
Go语言通过减少关键字的数量(25 个)来简化编码过程中的混乱和复杂度。干净、整齐和简洁的语法也能够提高程序的编译速度,因为这些关键字在编译过程中少到甚至不需要符号表来协助解析。
|
||||
|
||||
这些方面的工作都是为了减少编码的工作量,甚至可以与 Java 的简化程度相比较。
|
||||
|
||||
Go 语言有一种极简抽象艺术家的感觉,因为它只提供了一到两种方法来解决某个问题,这使得开发者们的代码都非常容易阅读和理解。众所周知,代码的可读性是软件工程里最重要的一部分( ***译者注:代码是写给人看的,不是写给机器看的*** )。
|
||||
|
||||
这些设计理念没有建立其它概念之上,所以并不会因为牵扯到一些概念而将某个概念复杂化,他们之间是相互独立的。
|
||||
|
||||
Go 语言有一套完整的编码规范,你可以在 [Go 语言编码规范](http://golang.org/doc/go_spec.html) 页面进行查看。
|
||||
|
||||
它不像 Ruby 那样通过实现过程来定义编码规范。作为一门具有明确编码规范的语言,它要求可以采用不同的编译器如 gc 和 gccgo(第 2.1 节)进行编译工作,这对语言本身拥有更好的编码规范起到很大帮助。
|
||||
|
||||
[LALR](http://en.wikipedia.org/wiki/LALR_parser) 是 Go 语言的语法标准,你也可以在 `src/cmd/gc/go.y` 中查看到,这种语法标准在编译时不需要符号表来协助解析。
|
||||
|
||||
##1.2.5 语言的特性
|
||||
Go 语言从本质上(程序和结构方面)来实现并发编程。
|
||||
|
||||
因为 Go 语言没有类和继承的概念,所以它和 Java 或 C++ 看起来并不相同。但是它通过接口(interface)的概念来实现多态性。Go 语言有一个清晰易懂的轻量级类型系统,在类型之间也没有层级之说。因此可以说这是一门混合型的语言。
|
||||
|
||||
在传统的面向对象语言中,使用面向对象编程技术显得非常的臃肿,它们总是通过复杂的模式来构建庞大的类型层级,这违背了编程语言应该提升生产力的宗旨。
|
||||
|
||||
函数是 Go 语言中的基本构件,它们的使用方法非常灵活。在第六章,我们会看到 Go 语言在函数式编程方面的基本概念。
|
||||
|
||||
Go 语言使用静态类型,所以它是类型安全的一门语言,加上通过构建到本地代码,程序的执行速度也非常快。
|
||||
|
||||
作为强类型语言,隐式的类型转换是不被允许的,记住一条原则:让所有的东西都是显式的。
|
||||
|
||||
Go 语言其实也有一些动态语言的特性(通过关键字 `var`),所以它对那些逃离 Java 和 .Net 世界而使用 Python、Ruby、PHP 和 JavaScript 的开发者们也具有很大的吸引力。
|
||||
|
||||
Go 语言支持交叉编译,比如说你可以在运行 Linux 系统的计算机上开发运行下 Windows 下运行的应用程序。这是第一门完全支持 UTF-8 的编程语言( ***译者注:.NET好像也支持吧?*** ),这不仅体现在它可以处理使用 UTF-8 编码的字符串,就连它的源码文件格式都是使用的 UTF-8 编码。Go 语言做到了真正的国际化!
|
||||
|
||||
##1.2.6 语言的用途
|
||||
Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过了。
|
||||
|
||||
Go 语言一个非常好的目标就是实现所谓的复杂事件处理([CEP](http://en.wikipedia.org/wiki/Complex_event_processing)),这项技术要求海量并行支持,高度的抽象化和高性能。当我们进入到物联网时代,CEP 必然会成为人们关注的焦点。
|
||||
|
||||
但是 Go 语言同时也是一门可以用于实现一般目标的语言,例如对于文本的处理,前端展现,甚至像使用脚本一样使用它。
|
||||
|
||||
值得注意的是,因为垃圾回收和自动内存分配的原因,Go 语言不适合用来开发对实时性要求很高的软件。
|
||||
|
||||
越来越多的谷歌内部的大型分布式应用程序都开始使用 Go 语言来开发,例如谷歌地球的一部分代码就是由 Go 语言完成的。
|
||||
|
||||
如果你想知道一些其它组织使用Go语言开发的实际应用项目,你可以到这个页面进行查看:[http://go-lang.cat-v.org/organizations-using-go](http://go-lang.cat-v.org/organizations-using-go)。出于隐私保护的考虑,许多公司的项目都没有展示在这个页面。我们将会在第 21 章讨论到一个使用 Go 语言开发的大型存储区域网络(SAN)案例。
|
||||
|
||||
在 Chrome 浏览器中内置了一款 Go 语言的编译器用于本地客户端(NaCl( ***为什么我觉得这是"钠"?*** )),这很可能会被用于在 Chrome OS 中执行 Go 语言开发的应用程序。
|
||||
|
||||
Go 语言可以在 Inter 或 ARM 处理器上运行,因此它也可以在安卓系统下运行,例如 Nexus 系列的产品。
|
||||
|
||||
在 Google App Engine 中使用 Go 语言:2011年5月5日,官方发布了用于开发运行在 Google App Engine 上的 Web 应用的 Go SDK,在此之前,开发者们只能选择使用 Python 或者 Java。这主要是 David Symonds 和 Nigel Tao 努力的成果。目前最新的稳定版是基于 r60.3 的SDK 1.6.1,于 2011 年 12 月 13 日发布。当前 Go 语言的稳定版本是 Go 1( ***译者注:目前最新的稳定版是Go1.1*** )。
|
||||
|
||||
##1.2.7 关于特性丢失
|
||||
许多能够在大多数面向对象语言中使用的特性 Go 语言都没有支持,但其中的一部分可能会在未来被支持。
|
||||
|
||||
- 为了简化设计,不支持函数重载和操作符重载
|
||||
- 为了避免在 C/C++ 开发中的一些 Bug 和混乱,不支持隐式转换
|
||||
- Go 语言通过另一种途径实现面向对象设计(第 10 - 11 章)来放弃类和类型的继承
|
||||
- 尽管在接口的使用方面(第 11 章)可以实现类似变体类型的功能,但本身不支持变体类型
|
||||
- 不支持动态加载代码
|
||||
- 不支持动态链接库
|
||||
- 不支持泛型
|
||||
- 通过 `recover` 和 `panic` 来替代异常机制(第 13.2 - 3 节)
|
||||
- 不支持断言
|
||||
- 不支持静态变量
|
||||
|
||||
关于 Go 语言开发团队对于这些方面的讨论,你可以通过这个页面查看:[http://golang.org/doc/go_faq.html](http://golang.org/doc/go_faq.html)
|
||||
|
||||
##1.2.8 使用 Go 语言编程
|
||||
如果你有其它语言的编程经历(面向对象编程语言,如:Java、C#、Object-C、Python、Ruby),在你进入到 Go 语言的世界之后,你将会像迷恋你的 X 语言一样无法自拔。Go 语言使用了与其它语言不同的设计模式,所以当你尝试将你的X语言的代码迁移到 Go 语言时,你将会非常失望,所以你需要从头开始,用 Go 的理念来思考。
|
||||
|
||||
如果你在至高点使用 Go 的理念来重新审视和分析一个问题,你通常会找到一个适用于 Go 语言的优雅的解决方案。
|
||||
|
||||
##1.2.9 小结
|
||||
这里列举一些 Go 语言的必杀技:
|
||||
|
||||
- 简化问题,易于学习
|
||||
- 内存管理,简洁语法,易于使用
|
||||
- 快速编译,高效开发
|
||||
- 高效执行
|
||||
- 并发支持,轻松驾驭
|
||||
- 静态类型
|
||||
- 标准类库,规范统一
|
||||
- 易于部署
|
||||
- 文档全面
|
||||
- 免费开源
|
||||
|
||||
##链接
|
||||
- [目录](directory.md)
|
||||
- 上一节:[起源与发展](01.1.md)
|
||||
- 下一章:[安装与运行环境](02.1.md)
|
||||
|
@@ -1,15 +1,15 @@
|
||||
##啊哦,亲,你看得也太快了。。。还没翻译完呢 0 0
|
||||
要不等到 ***2013年4月11日*** 再来看看吧~~
|
||||
|
||||
这里还有一些其它的学习资源噢~
|
||||
|
||||
- [《Go 编程基础》](https://github.com/Unknwon/go-fundamental-programming):已更新至 [第六课](https://github.com/Unknwon/go-fundamental-programming/blob/master/lecture6/lecture6.md)
|
||||
- [《Go Web编程》](https://github.com/astaxie/build-web-application-with-golang)
|
||||
|
||||
神马?你说你不想学习?那好吧,去逛逛论坛看看行情也行~
|
||||
|
||||
- [Golang中文社区](http://bbs.mygolang.com/forum.php)
|
||||
- [Go语言学习园地](http://studygolang.com/)
|
||||
- [Golang中国](http://golang.tc)
|
||||
|
||||
#2.1 平台与架构
|
||||
##啊哦,亲,你看得也太快了。。。还没翻译完呢 0 0
|
||||
要不等到 ***2013 年 4 月 11 日*** 再来看看吧~~
|
||||
|
||||
这里还有一些其它的学习资源噢~
|
||||
|
||||
- [《Go编程基础》](https://github.com/Unknwon/go-fundamental-programming):已更新至 [第六课](https://github.com/Unknwon/go-fundamental-programming/blob/master/lecture6/lecture6.md)
|
||||
- [《Go Web编程》](https://github.com/astaxie/build-web-application-with-golang)
|
||||
|
||||
神马?你说你不想学习?那好吧,去逛逛论坛看看行情也行~
|
||||
|
||||
- [Golang中文社区](http://bbs.mygolang.com/forum.php)
|
||||
- [Go语言学习园地](http://studygolang.com/)
|
||||
- [Golang中国](http://golang.tc)
|
||||
|
||||
#2.1 平台与架构
|
||||
|
@@ -1,46 +1,46 @@
|
||||
#目录
|
||||
- [前言](preface.md)
|
||||
|
||||
## 第一部分:学习 Go 语言
|
||||
- 第1章:Go语言的起源,发展与普及
|
||||
- 1.1 [起源与发展](01.1.md)
|
||||
- 1.2 [语言的主要特性与发展的环境和影响因素](01.2.md)
|
||||
- 第2章:安装与运行环境
|
||||
- 2.1 [平台与架构](02.1.md)
|
||||
- 第3章:编辑器、集成开发环境与其它工具
|
||||
|
||||
##第二部分:语言的核心结构与技术
|
||||
- 第4章:基本结构和基本数据类型
|
||||
- 第5章:控制结构
|
||||
- 第6章:函数(function)
|
||||
- 第7章:数组(array)与切片(slice)
|
||||
- 第8章:Maps
|
||||
- 第9章:包(package)
|
||||
- 第10章:结构(struct)与方法(method)
|
||||
- 第11章:接口(interface)与反射(reflection)
|
||||
|
||||
##第三部分:Go 高级编程
|
||||
- 第12章:读写数据
|
||||
- 第13章:错误处理与测试
|
||||
- 第14章:goroutine 与 channel
|
||||
- 第15章:网络、模版与网页应用
|
||||
|
||||
##第四部分:实际应用
|
||||
- 第16章:常见的陷阱与错误
|
||||
- 第17章:模式
|
||||
- 第18章:出于性能考虑的实用代码片段
|
||||
- 第19章:构建一个完整的应用程序
|
||||
- 第20章:Go语言在 Google App Engine 的使用
|
||||
- 第21章:实际部署案例
|
||||
|
||||
##附录
|
||||
- A 代码引用
|
||||
- B 有趣的 Go 引用
|
||||
- C 代码示例列表
|
||||
- D 书中的包引用
|
||||
- E 书中的工具引用
|
||||
- F 常见问题解答
|
||||
- G 习题答案
|
||||
- H 参考文献
|
||||
|
||||
##索引
|
||||
#目录
|
||||
- [前言](preface.md)
|
||||
|
||||
## 第一部分:学习 Go 语言
|
||||
- 第1章:Go 语言的起源,发展与普及
|
||||
- 1.1 [起源与发展](01.1.md)
|
||||
- 1.2 [语言的主要特性与发展的环境和影响因素](01.2.md)
|
||||
- 第2章:安装与运行环境
|
||||
- 2.1 [平台与架构](02.1.md)
|
||||
- 第3章:编辑器、集成开发环境与其它工具
|
||||
|
||||
##第二部分:语言的核心结构与技术
|
||||
- 第4章:基本结构和基本数据类型
|
||||
- 第5章:控制结构
|
||||
- 第6章:函数(function)
|
||||
- 第7章:数组(array)与切片(slice)
|
||||
- 第8章:Maps
|
||||
- 第9章:包(package)
|
||||
- 第10章:结构(struct)与方法(method)
|
||||
- 第11章:接口(interface)与反射(reflection)
|
||||
|
||||
##第三部分:Go 高级编程
|
||||
- 第12章:读写数据
|
||||
- 第13章:错误处理与测试
|
||||
- 第14章:goroutine 与 channel
|
||||
- 第15章:网络、模版与网页应用
|
||||
|
||||
##第四部分:实际应用
|
||||
- 第16章:常见的陷阱与错误
|
||||
- 第17章:模式
|
||||
- 第18章:出于性能考虑的实用代码片段
|
||||
- 第19章:构建一个完整的应用程序
|
||||
- 第20章:Go 语言在 Google App Engine 的使用
|
||||
- 第21章:实际部署案例
|
||||
|
||||
##附录
|
||||
- A 代码引用
|
||||
- B 有趣的 Go 引用
|
||||
- C 代码示例列表
|
||||
- D 书中的包引用
|
||||
- E 书中的工具引用
|
||||
- F 常见问题解答
|
||||
- G 习题答案
|
||||
- H 参考文献
|
||||
|
||||
##索引
|
||||
|
130
eBook/preface.md
130
eBook/preface.md
@@ -1,65 +1,65 @@
|
||||
#前言
|
||||
###***用更少的代码,更短的编译时间,创建运行更快的程序,享受更多的乐趣***
|
||||
|
||||
对于学习 Go 编程语言的爱好者来说,这本书无疑是最适合你的一本书籍,这里包含了当前最全面的学习资源。本书通过对官方的在线文档、名人博客、书籍、相关文章以及演讲的资料收集和整理,并结合我自身在软件工程、编程语言和数据库开发的授课经验,将这些零碎的知识点组织成系统化的概念和技术分类来进行讲解。
|
||||
|
||||
随着软件规模的不断扩大,诸多的学者和谷歌的开发者们在公司内部的软件开发过程中开始经历大量的挫折,在诸多问题上都不能给出令人满意的解决方案,尤其是在使用 C++ 来开发大型的服务端软件时,情况更是不容乐观。由于二进制文件一般都是非常巨大的,因此需要耗费大量的时间在编译这些文件上,同时编程语言的设计思想也已经非常陈旧,这些情况都充分证明了现有的编程语言已不符合时下的生产环境。尽管硬件在过去的几十年中有了飞速的发展,但人们依旧没有找到机会去改变 C++ 在软件开发的重要地位,并在实际开发过程中忍受着它所带来的令人头疼的一些问题。因此学者们坐下来总结出了现在生产环境与软件开发之间的主要矛盾,并尝试设计一门全新的编程语言来解决这些问题。
|
||||
|
||||
以下就是他们讨论得出的对编程语言的设计要求:
|
||||
- 能够以更快的速度开发软件
|
||||
- 开发出的软件能够很好地在现代的多核计算机上工作
|
||||
- 开发出的软件能够很好地在网络环境下工作
|
||||
- 使人们能够享受软件开发的过程
|
||||
|
||||
Go 语言就在这样的环境下诞生了,它让人感觉像是 Python 或 Ruby 这样的动态语言,但却又拥有像 C 或者 Java 这类语言的高性能和安全性。
|
||||
|
||||
Go 语言出现的目的是希望在编程领域创造最实用的方式来进行软件开发。它并不是要用奇怪的语法和晦涩难懂的概念来从根本上推翻已有的编程语言,而是建立并改善了 C、Java、C# 中的许多语法风格。它提倡通过接口来针对面向对象编程,通过 goroutine 和 channel 来支持并发和并行编程。
|
||||
|
||||
这本书是为那些想要学习 Go 这门全新的,迷人的和充满希望的编程语言的开发者量身定做的。当然,你在学习 Go 语言之前需要具备一些关于编程的基础知识和经验,并且拥有合适的学习环境,但你并不需要对 C 或者 Java 或其它类似的语言有非常深入的了解。
|
||||
|
||||
对于那些熟悉 C 或者面向对象编程语言的开发者,我们将会在本书中用 Go 和一些编程语言的相关概念进行比较(书中会使用大家所熟知的缩写“OO”来表示面向对象)。
|
||||
|
||||
本书将会从最基础的概念讲起,同时也会讨论一些类似在应用 goroutine 和 channel 时有多少种不同的模式,如何在 Go 语言中使用谷歌 API,如何操作内存,如何在 Go 语言中进行程序测试和如何使用模板来开发Web应用这些高级概念和技巧。
|
||||
|
||||
在本书的第一部分,我们将会讨论 Go 语言的起源(第1章),以及如何安装 Go 语言(第2章)和开发环境(第3章)。
|
||||
|
||||
在本书的第二部分,我们将会带领你贯穿 Go 语言的核心思想,譬如简单与复杂类型(第4,7,8章),控制结构(第5章),函数(第6章),结构与方法(第10章)和接口(第11章)。我们会对 Go 语言的函数式和面向对象编程进行透彻的讲解,包括如何使用 Go 语言来构造大型项目(第9章)。
|
||||
|
||||
在本书的第三部分,你将会学习到如何处理不同格式的文件(第12章)和如何在 Go 语言中巧妙地使用错误处理机制(第13章)。然后我们会对 Go 语言中最值得称赞的设计 goroutine 和 channel 进行并发和多核应用的基本技巧的讲解(第14章)。最后,我们会讨论如何将 Go 语言应用到分布式和Web应用中的相关网络技巧(第15章)。
|
||||
|
||||
我们会在本书的第四部分向你展示许多 Go 语言的开发模式和一些编码规范,以及一些非常有用的代码片段(第18章)。在前面章节完成对所有的 Go 语言技巧的学习之后,你将会学习如何构造一个完整 Go 语言项目(第19章),然后我们会介绍一些关于 Go 语言在云(Google App Engine)方面的应用(第20章)。在本书的最后一章(第21章),我们会讨论一些在全世界范围内已经将 Go 语言投入实际开发的公司和组织。本书将会在最后给出一些对 Go 语言爱好者的引用,Go 相关包和工具的参考,以及章节练习的答案和所有参考资源和文献的清单。
|
||||
|
||||
Go 语言有一个被称之为“没有废物”的宗旨,就是将一切没有必要的东西都去掉,不能去掉的就无底线地简化,同时追求最大程度的自动化。他完美地诠释了敏捷编程的KISS秘诀:短小精悍!
|
||||
|
||||
Go 语言通过改善或去除在 C、C++ 或 Java 中的一些所谓“开放”特性来让开发者们的工作更加便利。这里只举例其中的几个,比如对于变量的默认初始化,内存分配与自动回收,以及更简洁却不失健壮的控制结构。同时我们也会发现 Go 语言旨在减少不必要的编码工作,这使得 Go 语言的代码更加简洁,从而比传统的面向对象语言更容易阅读和理解。
|
||||
|
||||
与 C++ 或 Java 这些有着庞大体系的语言相比,Go 语言简洁到可以将它整个的装入你的大脑中,而且比学习 Scala(Java 的并发语言)有更低的门槛,真可谓是 21 世纪的 C 语言!
|
||||
|
||||
作为一门系统编程语言,你不应该为 Go 语言的大多数代码示例和练习都和控制台有着密不可分的关系而感到惊奇,因为提供平台依赖性的 GUI(用户界面)框架并不是一个简单的任务。有许多由第三方发起的 GUI 框架项目正在如火如荼地进行中,或许我们会在不久的将来看到一些可用的 Go 语言 GUI 框架。不过现阶段的 Go 语言已经提供了大量有关 Web 方面的功能,我们可以通过它强大的 http 和 template 包来达到 Web 应用的 GUI 实现。
|
||||
|
||||
我们会经常涉及到一些关于 Go 语言的编码规范,了解和使用这些已经被广泛认同的规范应该是你学习阶段最重要的实践。我会在书中尽量使用已经讲解的概念或者技巧来解释相关的代码示例,以避免你在不了解某些高级概念的情况下而感到迷茫。
|
||||
|
||||
我们通过 227 个完整的代码示例和书中的解释说明来对所有涉及到的概念和技巧进行彻底的讲解,你可以下载这些代码到你的电脑上运行,从而加深对概念的理解。
|
||||
|
||||
本书会尽可能地将前后章节的内容联系起来,当然这也同时要求你通过学习不同的知识来对一个问题提出尽可能多的解决方案。记住,学习一门新语言的最佳方式就是实践,运行它的代码,修改并尝试更多的方案。因此,你绝对不可以忽略书中的 130 个代码练习,这将对你学习好 Go 语言有很大的帮助。比如,我们就为斐波那契算法提供了 13 个不同的版本,而这些版本都使用了不同的概念和技巧。
|
||||
|
||||
你可以通过访问本书的[官方网站](https://sites.google.com/site/thewaytogo2012/)下载书中的代码,并获得有关本书的勘误情况和内容更新。
|
||||
|
||||
为了让你在成为 Go 语言大师的道路上更加顺利,我们会专注于一些特别的章节以提供 Go 语言开发模式的最佳实践,同时也会帮助初学者逃离一些语言的陷阱。第 18 章可以作为你在开发时的一个参考手册,因为当中包含了众多的有价值的代码片段以及相关的解释说明。
|
||||
|
||||
最后要说明的是,你可以通过完整的索引来快速定位你需要阅读的章节。书中所有的代码都在 Go1 版本下测试通过。( ***译者注:所有代码经作者同意将会根据需要进行相关修改以在 Go1.1 版本下运行*** )
|
||||
|
||||
这里有一段来自在 C++、Java 和 Python 领域众所周知的专家 ruce Eckel 的评论:
|
||||
|
||||
“作为一个有着 C/C++ 背景的开发者,我在使用 Go 语言时仿佛呼吸到了新鲜空气一般,令人心旷神怡。我认为使用 Go 语言进行系统编程开发比使用 C++ 有着更显著的优势,因为它在解决一些很难用 C++ 解决的问题的同时,让我的工作变得更加高效。我并不是说 C++ 的存在是一个错误,相反地,我认为这是历史发展的必然结果。当我深陷在 C
|
||||
语言这门略微比汇编语言好一点的泥潭时,我坚信任何语言的构造都不可能支持大型项目的开发。像垃圾回收或并发语言支持这类东西,在当时都是极其荒谬的主意,根本没有人在乎。C++ 向大型项目开发迈出了重要的第一步,带领我们走进这个广袤无垠的世界。很庆幸 Stroustrup 做了让 C++ 兼容 C 语言以能够让其编译 C 程序这个正确的决定。我们当时需要 C++ 的出现。”
|
||||
|
||||
“之后我们学到了更多。我们毫无疑问地接受了垃圾回收,异常处理和虚拟机这些当年人们认为只有疯子才会想的东西。C++ 的复杂程度(新版的 C++ 甚至更加复杂)极大了影响了软件开发的高效性,这使得它再也不再适合这个时代。人们不再像过往那样认同在 C++ 中兼容使用 C 语言的方法,认为这些工作只是在浪费时间,牺牲人们的努力。就在此时,Go 语言已经成功地解决了 C++ 中那些本打算解决却未能解决的关键问题。”
|
||||
|
||||
我非常想要向发明这门精湛的语言的 Go 开发团队表示真挚的感谢,尤其是团队的领导者 Rob Pike、Russ Cox 和 Andrew Gerrand,他们阐述的例子和说明都非常的完美。同时,我还要感谢 Miek Gieben、Frank Muller、Ryanne Dolan 和 Satish V.J. 给予我巨大的帮助,还有那些 Golang-nuts 邮件列表里的所有的成员。
|
||||
|
||||
欢迎来到 Go 语言开发的奇妙世界!
|
||||
|
||||
##链接
|
||||
- [目录](directory.md)
|
||||
- 下一部分: [Go语言的起源,发展与普及](01.1.md)
|
||||
#前言
|
||||
###***用更少的代码,更短的编译时间,创建运行更快的程序,享受更多的乐趣***
|
||||
|
||||
对于学习 Go 编程语言的爱好者来说,这本书无疑是最适合你的一本书籍,这里包含了当前最全面的学习资源。本书通过对官方的在线文档、名人博客、书籍、相关文章以及演讲的资料收集和整理,并结合我自身在软件工程、编程语言和数据库开发的授课经验,将这些零碎的知识点组织成系统化的概念和技术分类来进行讲解。
|
||||
|
||||
随着软件规模的不断扩大,诸多的学者和谷歌的开发者们在公司内部的软件开发过程中开始经历大量的挫折,在诸多问题上都不能给出令人满意的解决方案,尤其是在使用 C++ 来开发大型的服务端软件时,情况更是不容乐观。由于二进制文件一般都是非常巨大的,因此需要耗费大量的时间在编译这些文件上,同时编程语言的设计思想也已经非常陈旧,这些情况都充分证明了现有的编程语言已不符合时下的生产环境。尽管硬件在过去的几十年中有了飞速的发展,但人们依旧没有找到机会去改变 C++ 在软件开发的重要地位,并在实际开发过程中忍受着它所带来的令人头疼的一些问题。因此学者们坐下来总结出了现在生产环境与软件开发之间的主要矛盾,并尝试设计一门全新的编程语言来解决这些问题。
|
||||
|
||||
以下就是他们讨论得出的对编程语言的设计要求:
|
||||
- 能够以更快的速度开发软件
|
||||
- 开发出的软件能够很好地在现代的多核计算机上工作
|
||||
- 开发出的软件能够很好地在网络环境下工作
|
||||
- 使人们能够享受软件开发的过程
|
||||
|
||||
Go 语言就在这样的环境下诞生了,它让人感觉像是 Python 或 Ruby 这样的动态语言,但却又拥有像 C 或者 Java 这类语言的高性能和安全性。
|
||||
|
||||
Go 语言出现的目的是希望在编程领域创造最实用的方式来进行软件开发。它并不是要用奇怪的语法和晦涩难懂的概念来从根本上推翻已有的编程语言,而是建立并改善了 C、Java、C# 中的许多语法风格。它提倡通过接口来针对面向对象编程,通过 goroutine 和 channel 来支持并发和并行编程。
|
||||
|
||||
这本书是为那些想要学习 Go 这门全新的,迷人的和充满希望的编程语言的开发者量身定做的。当然,你在学习 Go 语言之前需要具备一些关于编程的基础知识和经验,并且拥有合适的学习环境,但你并不需要对 C 或者 Java 或其它类似的语言有非常深入的了解。
|
||||
|
||||
对于那些熟悉 C 或者面向对象编程语言的开发者,我们将会在本书中用 Go 和一些编程语言的相关概念进行比较(书中会使用大家所熟知的缩写“OO”来表示面向对象)。
|
||||
|
||||
本书将会从最基础的概念讲起,同时也会讨论一些类似在应用 goroutine 和 channel 时有多少种不同的模式,如何在 Go 语言中使用谷歌 API,如何操作内存,如何在 Go 语言中进行程序测试和如何使用模板来开发Web应用这些高级概念和技巧。
|
||||
|
||||
在本书的第一部分,我们将会讨论 Go 语言的起源(第1章),以及如何安装 Go 语言(第2章)和开发环境(第3章)。
|
||||
|
||||
在本书的第二部分,我们将会带领你贯穿 Go 语言的核心思想,譬如简单与复杂类型(第4,7,8章),控制结构(第5章),函数(第6章),结构与方法(第10章)和接口(第11章)。我们会对 Go 语言的函数式和面向对象编程进行透彻的讲解,包括如何使用 Go 语言来构造大型项目(第9章)。
|
||||
|
||||
在本书的第三部分,你将会学习到如何处理不同格式的文件(第12章)和如何在 Go 语言中巧妙地使用错误处理机制(第13章)。然后我们会对 Go 语言中最值得称赞的设计 goroutine 和 channel 进行并发和多核应用的基本技巧的讲解(第14章)。最后,我们会讨论如何将 Go 语言应用到分布式和Web应用中的相关网络技巧(第15章)。
|
||||
|
||||
我们会在本书的第四部分向你展示许多 Go 语言的开发模式和一些编码规范,以及一些非常有用的代码片段(第18章)。在前面章节完成对所有的 Go 语言技巧的学习之后,你将会学习如何构造一个完整 Go 语言项目(第19章),然后我们会介绍一些关于 Go 语言在云(Google App Engine)方面的应用(第20章)。在本书的最后一章(第21章),我们会讨论一些在全世界范围内已经将 Go 语言投入实际开发的公司和组织。本书将会在最后给出一些对 Go 语言爱好者的引用,Go 相关包和工具的参考,以及章节练习的答案和所有参考资源和文献的清单。
|
||||
|
||||
Go 语言有一个被称之为“没有废物”的宗旨,就是将一切没有必要的东西都去掉,不能去掉的就无底线地简化,同时追求最大程度的自动化。他完美地诠释了敏捷编程的KISS秘诀:短小精悍!
|
||||
|
||||
Go 语言通过改善或去除在 C、C++ 或 Java 中的一些所谓“开放”特性来让开发者们的工作更加便利。这里只举例其中的几个,比如对于变量的默认初始化,内存分配与自动回收,以及更简洁却不失健壮的控制结构。同时我们也会发现 Go 语言旨在减少不必要的编码工作,这使得 Go 语言的代码更加简洁,从而比传统的面向对象语言更容易阅读和理解。
|
||||
|
||||
与 C++ 或 Java 这些有着庞大体系的语言相比,Go 语言简洁到可以将它整个的装入你的大脑中,而且比学习 Scala(Java 的并发语言)有更低的门槛,真可谓是 21 世纪的 C 语言!
|
||||
|
||||
作为一门系统编程语言,你不应该为 Go 语言的大多数代码示例和练习都和控制台有着密不可分的关系而感到惊奇,因为提供平台依赖性的 GUI(用户界面)框架并不是一个简单的任务。有许多由第三方发起的 GUI 框架项目正在如火如荼地进行中,或许我们会在不久的将来看到一些可用的 Go 语言 GUI 框架。不过现阶段的 Go 语言已经提供了大量有关 Web 方面的功能,我们可以通过它强大的 http 和 template 包来达到 Web 应用的 GUI 实现。
|
||||
|
||||
我们会经常涉及到一些关于 Go 语言的编码规范,了解和使用这些已经被广泛认同的规范应该是你学习阶段最重要的实践。我会在书中尽量使用已经讲解的概念或者技巧来解释相关的代码示例,以避免你在不了解某些高级概念的情况下而感到迷茫。
|
||||
|
||||
我们通过 227 个完整的代码示例和书中的解释说明来对所有涉及到的概念和技巧进行彻底的讲解,你可以下载这些代码到你的电脑上运行,从而加深对概念的理解。
|
||||
|
||||
本书会尽可能地将前后章节的内容联系起来,当然这也同时要求你通过学习不同的知识来对一个问题提出尽可能多的解决方案。记住,学习一门新语言的最佳方式就是实践,运行它的代码,修改并尝试更多的方案。因此,你绝对不可以忽略书中的 130 个代码练习,这将对你学习好 Go 语言有很大的帮助。比如,我们就为斐波那契算法提供了 13 个不同的版本,而这些版本都使用了不同的概念和技巧。
|
||||
|
||||
你可以通过访问本书的[官方网站](https://sites.google.com/site/thewaytogo2012/)下载书中的代码,并获得有关本书的勘误情况和内容更新。
|
||||
|
||||
为了让你在成为 Go 语言大师的道路上更加顺利,我们会专注于一些特别的章节以提供 Go 语言开发模式的最佳实践,同时也会帮助初学者逃离一些语言的陷阱。第 18 章可以作为你在开发时的一个参考手册,因为当中包含了众多的有价值的代码片段以及相关的解释说明。
|
||||
|
||||
最后要说明的是,你可以通过完整的索引来快速定位你需要阅读的章节。书中所有的代码都在 Go1 版本下测试通过。( ***译者注:所有代码经作者同意将会根据需要进行相关修改以在 Go1.1 版本下运行*** )
|
||||
|
||||
这里有一段来自在 C++、Java 和 Python 领域众所周知的专家 ruce Eckel 的评论:
|
||||
|
||||
“作为一个有着 C/C++ 背景的开发者,我在使用 Go 语言时仿佛呼吸到了新鲜空气一般,令人心旷神怡。我认为使用 Go 语言进行系统编程开发比使用 C++ 有着更显著的优势,因为它在解决一些很难用 C++ 解决的问题的同时,让我的工作变得更加高效。我并不是说 C++ 的存在是一个错误,相反地,我认为这是历史发展的必然结果。当我深陷在 C
|
||||
语言这门略微比汇编语言好一点的泥潭时,我坚信任何语言的构造都不可能支持大型项目的开发。像垃圾回收或并发语言支持这类东西,在当时都是极其荒谬的主意,根本没有人在乎。C++ 向大型项目开发迈出了重要的第一步,带领我们走进这个广袤无垠的世界。很庆幸 Stroustrup 做了让 C++ 兼容 C 语言以能够让其编译 C 程序这个正确的决定。我们当时需要 C++ 的出现。”
|
||||
|
||||
“之后我们学到了更多。我们毫无疑问地接受了垃圾回收,异常处理和虚拟机这些当年人们认为只有疯子才会想的东西。C++ 的复杂程度(新版的 C++ 甚至更加复杂)极大了影响了软件开发的高效性,这使得它再也不再适合这个时代。人们不再像过往那样认同在 C++ 中兼容使用 C 语言的方法,认为这些工作只是在浪费时间,牺牲人们的努力。就在此时,Go 语言已经成功地解决了 C++ 中那些本打算解决却未能解决的关键问题。”
|
||||
|
||||
我非常想要向发明这门精湛的语言的 Go 开发团队表示真挚的感谢,尤其是团队的领导者 Rob Pike、Russ Cox 和 Andrew Gerrand,他们阐述的例子和说明都非常的完美。同时,我还要感谢 Miek Gieben、Frank Muller、Ryanne Dolan 和 Satish V.J. 给予我巨大的帮助,还有那些 Golang-nuts 邮件列表里的所有的成员。
|
||||
|
||||
欢迎来到 Go 语言开发的奇妙世界!
|
||||
|
||||
##链接
|
||||
- [目录](directory.md)
|
||||
- 下一部分: [Go 语言的起源,发展与普及](01.1.md)
|
||||
|
Reference in New Issue
Block a user