Go入门指南中文版)

zdhshore 51 0 PDF 2019-02-17 13:02:20

Go入门指南式,如何在Go语言中使用谷歌APⅠ,如何操作内存,如何在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语言有一个被称之为“没有废物”的宗旨,就是将一切没有必要的东西都去掉,不能去掉的就无底线地简化,同时追求最大程度的自动化。他完美地诠释了敏捷编程的ⅪSS秘诀:短小精悍!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个完整的代码示例和书中的解释说明来对所有涉及到的概念和技巧进行彻底的讲解,你可以本文档使用看云构建Go入门指南下载这些代码到你的电脑上运行,从而加深对概念的理解。本书会尽可能地将前后章节的内容联系起来,当然这也同时要求你通过学习不同的知识来对一个问题提出尽可能多的解决方案。记住,学习一门新语言的最佳方式就是实践,运行它的代码,修改并尝试更多的方案。因此,你绝对不可以忽略书中的130个代码练习,这将对你学习好Go语言有很大的帮助。比如,我们就为斐波那契算法提供了13个不同的版本,而这些版本都使用了不同的概念和技巧。你可以通过访问本书的官方网站下载书中的代码(译者注:所有代码文件已经包括在 Github仓库中),并获得有关本书的勘误情况和内容更新。为了让你在成为Go语言大师的道路上更加顺利,我们会专注于一些特别的章节以提供Go语言开发模式的最佳实践,同时也会帮助初学者逃离一些语言的陷阱。第18章可以作为你在开发时的一个参考手册,因为当中包含了众多的有价值的代码片段以及相关的解释说明。最后要说明的是,你可以通过完整的索引来快速定位你需要阋读的章节。书中所有的代码都在Go1.4版本下测试通过。这里有一段来自在C++、Java和 Python领域众所周知的专家 Bruce eckel的评论作为一个有着CC++背景的开发者,我在使用Go语言时仿佛呼吸到了新鲜空气一般,令人心旷神怡。我认为使用Go语言进行系统编程开发比使用C++有着更显著的优势,因为它在解决一些很难用C++解决的问颎的同时,让我的工作变得更加高效。我并不是说C++的存在是一个错误,相反地,我认为这是历史发展的必然结果。当我深陷在℃语言这门略微比汇编语言好一点的泥潭时,我坚信仼何语言的构造都不可能支持大型项目的开发。像垃圾回收或并发语言支持这类东西,在当时都是极其荒谬的主意,根本没有人在乎。C++向大型项目开发迈出了重要的第一步,带领我们走进这个广袤无垠的世界。很庆幸Stroustrup做了让C++兼容C语言以能够让其编译C程序这个正确的决定。我们当时需要C++的出现之后我们学到了更多。我们亳无疑问地接受了垃圾回收,异常处理和虚拟机这些当年人们认为只有疯子才会想的东西。C++的复杂程度(新版的C++甚至更加复杂)极大了影响了软件开发的高效性,这使得它再也不再适合这个时代。人们不再像过往那样认同在C++中兼容使用C语言的方法,认为这些工作只是在浪费时间,牺牲人们的努力。就在此时,Go语言已经成功地解决了C++中那些本打算解决却未能解决的关键问题我非常想要向发明这门精湛的语言的Go开发团队表示真挚的感谢,尤其是团队的领导者 Rob pike、RuSsC∝x和 Andrew gerrand,他们阐述的例子和说明都非常的完美。同时,我还要感谢 Miek gieben、Frank Muller.、 Ryanne Dolan和 Satish VJ.给予我巨大的帮助,还有那些 golang-nuts邮件列表里的所有的成员。欢迎来到Go语言开发的奇妙世界!本文档使用看云构建Go入门指南第一部分:学习Go语言第1章:Go语言的起源,发展与普及第2章:安装与运行环境第3章:编辑器、集成开发环境与其它工具第1章:Go语言的起源,发展与普及1.1起源与发展Go语言起源2007年,并于2009年正式对外发布。它从2009年9月21日开始作为谷歌公司20%兼职项目,即相关员工利用20%的空余时间来参与Go语言的研发工作。该项目的三位领导者均是著名的I工程师: Robert griesemer,参与开发 Java Hotspot虚拟机; Rob pike,Go语言项目总负责人,贝尔实验室Un团队成员,参与的项目包括Plan9, Inferno操作系统和 Limbo编程语言;KenThompson,贝尔实验室Unix团队成员,C语言、Unix和Plan9的创始人之一,与 Rob pike共同开发了∪TF-8字符集规范。自2008年1月起, Ken Thompson就开始硏发一款以C语言为目标结果的编译器来拓展Go语言的设计思想这是—个由计算机领域“"发明之父”所组成的黄金团队,他们对系统编程语言,操作系统和并行都有着非常深刻的见解图11Go语言设计者: Griesemer、 Thompson和Pike本文档使用看云构建Go入门指南在2008年年中,Go语言的设计工作接近尾声,一些员工开始以全职工作状态投入到这个项目的编译器和运行实现上。 lan Lance Taylor也加入到了开发团队中,并于2008年5月创建了一个gc前端。Russ Cox加入开发团队后着手语言和类库方面的开发,也就是Go语言的标准包。在2009年10月30日, Rob pike以 Google Techtalk的形式第一次向人们宣告了Go语言的存在直到2009年11月10日,开发团队将Go语言项目以BSD- style授权(完全开源)正式公布在 Linux和 Mac os x平台上的版本。 Hector Chu于同年11月22日公布了 Windows版本作为一个开源项目,Go语言借助开源社区的有生力量达到快速地发展,并吸引更多的开发者来使用并改善它。自该开源项目发布以来,超过200名非谷歌员工的贡献者对Go语言核心部分提交了超过1000个修改建议。在过去的18个月里,又有150开发者贡献了新的核心代码。这俨然形成了世界上最大的开源团队,并使该项目跻身ohoh前2%的行列。大约在2011年4月10日,谷歌开始抽调员工进入全职开发Go语言项目。开源化的语言显然能够让更多的开发者参与其中并加速它的发展速度。 AndrewGerrand在2010年加入到开发团队中成为共同开发者与支持者在Go语言在2010年1月8日被τiobe(闻名于它的编程语言流行程度排名)宣布为“2009年年度语言”后,引起各界很大的反响。目前Go语言在这项排名中的最高记录是在2010年2月创下的第13名,流行程度1778%。时间轴2007年9月21日:雏形设计2009年11月10日:首次公开发布·2010年1月8日:当选2009年年度语言2010年5月:谷歌投入使用2011年5月5日: Google App Engine支持Go语言从2010年5月起,谷歌开始将Go语言投入到后端基础设施的实际开发中,例如开发用于管理后端复杂环境的项目。有句话叫“吃你自己的狗食”,这也体现了谷歌确实想要投资这门语言,并认为它是有生产价值的。Go语言的官方网站是 galang. org,这个站点采用 Python作为前端,并且使用Go语言自带的工具godot运行在 Google App Engine上来作为Web服务器提供文本内容。在官网的首页有一个功能叫做Go Playground,是一个Go代码的简单编辑器的沙盒,它可以在没有安装Go语言的情况下在你的浏览器中编译并运行Go,它提供了一些示例,其中包括国际惯例“ Hello, World!"。更多的信息详见github.com/galang/go,Go项目Bug追踪和功能预期详n github. com/golang/go/issuesGo通过以下的Logo来展示它的速度,并以囊地鼠( Gopher)作为它的吉祥物。本文档使用看云构建Go入门指南图12Go语言Logo谷歌邮件列表 galang-nuts非常活跃,每天的讨论和问题解答数以百计。关于Go语言在 Google App Engine的应用,这里有一个单独的邮件列表 google- appengine-go,不过2个邮件列表的讨论内容并不是分得很清楚,都会涉及到相关的话题。go-ang.cat-vorg/是Go语言开发社区的资源站,irc. freenode.net的#go-nuts是官方的 GO IRC频道。@ golan是Go语言在 Twitter的官方帐号,大家一般使用# golan作为话题标签。这里还有一个在 Linked-in的小组:ww. inkedin. com/ groups?gid=2524765&trk= myg_ugrp_ovr。Go编程语言的维基百科: en. wikipedia.org/wiki/G。( programming_languageGo语言相关资源的搜索引擎页面: gowalker。orgGo语言还有一个运行在 Google app engine上的 Go Tour,你也可以通过执行命令go install go-tour: googlecode. con/hg/ gotour安装到你的本地机器上。对于中文读者,可以访问该指南的中文版本,或通过命令goinstallhttps://bitbucket.org/mikespook/go-tour-zh/gotour进行安装。1.2语言的主要特性与发展的环境和影响因素1.2.1影响Go语言发展的早期编程语言o1.2.2为什么要创造一门编程语言o1.2.3Go语言的发展目标o1.2.4指导设计原则o1.2.5语言的特性o1.2.6语言的用途o1.27关于特性缺失1.2.8使用Go语言编程o1.29小结1.2.1影响Go语言发展的早期编程语言本文档使用看云构建Go入门指南正如“21世纪的C语言”这句话所说,Go语言并不是凭空而造的,而是和C++、Java和C#一样属于C系。不仅如此,设计者们还汲取了其它编程语言的精粹部分融入到Go语言当中。在声明和包的设计方面,Go语言受到 Pasca、 Modula和 Oberon系语言的影响;在并发原理的设计上,Go语言从同样受到 Tony Hoare的CSP(通信序列进程 Communicating Squentia/ Processes)理论影响的 Limbo和 Newsqueak的实践中借鉴了一些经验,并使用了和 Erlang类似的机制。这是一门完全开源的编程语言,因为它使用BSD授权许可,所以任何人都可以进行商业软件的开发而不需要支付任何费用。尽管为了能够让目前主流的开发者们能够对Go语言中的类C语言的语法感到非常亲切而易于转型,但是它在极大程度上简化了这些语法,使得它们比C/C++的语法更加简洁和千净。同时,Go语言也拥有一些动态语言的特性,这使得使用 Python和Ruby的开发者们在使用Go语言的时候感觉非常容易上手下图展示了一些其它编程语言对Go语言的影响:JavaJava, C#. etc.JavaScript, RubyC languageInhentanee via "Package defintionand other dynamic" InterfacelanguagesBasic syntaxPolymorph sm independentmple structureof inheritanceAdoption ofCommunicatingGoogle'sSequent al ProcessGo programmingGoogle serverlanguagesoftwareApplcationLimbodevelopmentChrome plug-inSpinoffDevelopers Ken Thompson.Rob Pike, etc. join effortdevelopmentPlan 9个UNIX图1.3其它编程语言对Go语言的影响本文档使用看云构建Go入门指南1.2.2为什么要创造一门编程语言C/C++的发展速度无法眼上计算机发展的脚步,十多年来也没有出现一门与时代相符的主流系统编程语言,因此人们需要一门新的系统编程语言来弥补这个空缺,尤其是在计算机信息时代。对比计算机性能的提升,软件开发领域不被认为发展地足够快或者比硬件发展更加成功(有许多项目均以失败告终),同时应用程序的体积始终在不断地扩大,这就迫切地需要一门具备更高层次概念的低级语言来突破现状。在Go语言岀现之前,开发者们总是面临非常艰难的抉择,究竟是使用执行速度快但是编译速度并不理想的语言(如:C++),还是使用编译速度较快但执行效率不佳的语言(如:NET、Java),或者说开发难度较低但执行速度一般的动态语言呢?显然,Go语言在这3个条件之间做到了最佳的平衡:快速编译,高效执行,易于开发。1.2.3Go语言的发展目标Go语言的主要目标是将静态语言的安全性和高效性与动态语言的易开发性进行有机结合,达到完美平衡,从而使编程变得更加有乐趣,而不是在艰难抉择中痛苦前行。因此,Go语言是一门类型安全和内存安全的编程语言。虽然Go语言中仍有指针的存在,但并不允许进行指针运算。Go语言的另一个目标是对于网络通信、并发和并行编程的极佳支持,从而更好地利用大量的分布式和多核的计算机,这一点对于谷歌内部的使用来说就非常重要了。设计者通过 goroutine这种轻量级线程的概念来实现这个目标,然后通过 channel来实现各个 goroutine之间的通信。他们实现了分段栈增长和goroutine在线程基础上多路复用技术的自动化。这个特性显然是Go语言最强有力的部分,不仅支持了日益重要的多核与多处理器计算机,也弥补了现存编程语言在这方面所存在的不足。Go语言中另一个非常重要的特性就是它的构建速度〔编译和链接到机器代码的速度),一般情况下构建个程序的时间只需要数百毫秒到几秒。作为大量使用C++来构建基础设施的谷歌来说,无疑从根本上摆脱了C++在构建速度上非常不理想的噩梦。这不仅极大地提升了开发者的生产力,同时也使得软件开发过程中的代码测试环节更加紧凑,而不必浪费大量的时间在等待程序的构建上依赖管理是现今软件开发的一个重要组成部分,但是C语言中“头文件″的概念却导致越来越多因为依赖关系而使得构建一个大型的项目需要长达几个小时的时间。人们越来越需要一门具有严格的、简洁的依赖关系分析系统从而能够快速编译的编程语言。这正是Go语言采用包模型的棖本原因,这个模型通过严格的依赖关系检査机制来加快程序构建的速度,提供了非常好的可量测性。整个Go语言标准库的编译时间一般都在20秒以内,其它的常规项目也只需要半秒钟的时间来完成编译工作。这种闪电般的编译速度甚至比编译C语言或者 Fortran更加快,使得编译这一环节不再成为在软件开发中困扰开发人员的问题。在这之前,动态语言将快速编译作为自身的一大亮点,像C++那样的静态语言一般都有非常漫长的编译和链接工作。而同样作为静态语言的Go语言,通过自身优良的构建机制,本文档使用看云构建Go入门指南成功地了去除了这个弊端,使得程序的构建过程变得微不足道,拥有了像脚本语言和动态语言那样的高效开发的能力。另外,Go语言在执行速度方面也可以与CC++相提并论。由于内存问题(通常称为内存泄漏)长期以来一直伴随着C++的开发者们,Go语言的设计者们认为内存管理不应该是开发人员所需要考虑的问题。因此尽管Go语言像其它静态语言-样执行本地代码,但它依旧运行在某种意义上的虛拟机,以此来实现高效快速的垃圾回收(使用了一个简单的标记清除算法)。尽管垃圾回收并不容易实现,但考虑这将是未来并发应用程序发展的一个重要组成部分,Go语言的设计者们还是完成了这项艰难的任务。Go语言还能够在运行时进行反射相关的操作使用 go install能够很轻松地对第三方包进行部署。此外,Go语言还攴持调用由C语言编写的海量库文件(第3.9节),从而能够将过去开发的软件进行快速迁移。1.2.4指导设计原贝Go语言通过减少关键字的数量(25个)来简化编码过程中的混乱和复杂度。千净、整齐和简洁的语法也能够提高程序的编译速度,因为这些关键字在编译过程中少到甚至不需要符号表来协助解析.这些方面的工作都是为了减少编码的工作量,甚至可以与Java的简化程度相比较。Go语言有一种极简抽象艺术家的感觉,因为它只提供了一到两种方法来解决某个问题,这使得开发者们的代码都非常容易阅读和理解。众所周知,代码的可读性是软件工程里最重要的一部分(译者注:代码是写给人看的,不是写给机器看的)这些设计理念没有建立其它概念之上,所以并不会因为牵扯到一些概念而将某个概念复杂化,他们之间是相互独立的。Go语言有一套完整的编码规范,你可以在Go语言编码规范页面迸行查看。它不像Ruby那样通过实现过程来定义编码规范。作为一门貝有明确编码规范的语言,它要求可以采用不同的编译器如gc和 gccgo〔第2.1节)进行编译工作,这对语言本身拥有更好的编码规范起到很大帮助,LALR是Go语言的语法标准,你也可以在src/ cmd/internal/jgc/goy中查看到,这种语法标准在编译时不需要符号表来协助解析。1.2.5语言的特性Go语言从本质上(程序和结构方面)来实现并发编程。本文档使用看云构建

用户评论
请输入评论内容
评分:
暂无评论