作者:谢孟军
出版社:电子工业出版社
格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT
Go Web编程试读:
版权信息COPYRIGHT INFORMATION书名:Go Web编程作者:谢孟军排版:燕子出版社:电子工业出版社出版时间:2013-06-01ISBN:9787121200915本书由电子工业出版社授权北京当当科文电子商务有限公司制作与发行。— · 版权所有 侵权必究 · —自 序缘起
自从一年半之前看到许式伟的博客,我认识了Go这一门语言,发现Go是C系的,个人又偏爱C语言,所以就开始了Go语言的学习之路,用三天时间学习了Go语言的所有语法和基础知识。恰逢当时手上有一些小项目练手,在项目开发中进一步发现Go语言具有三大优点:第一,性能好,我的Mac能够跑2万左右的并发;第二,语法简单,对于以前有C语言基础的人来说非常容易上手,我仅用一天时间就熟悉了基本语法,Go语言是一个上手即用的语言;第三,开发效率高,目前有很多编辑器支持Go语言,对于开发效率有很大的提升,一般的小项目半天就能解决。通过一年多来对Go语言项目的实战累积,我越来越觉得Go是一门工程语言,而不是其他学院派。无论是开发、测试、部署、项目规模的扩展,或者是团队协作,Go语言考虑都非常周到;而且其语法恰当好处,不多不少,够用就是它的设计原则,所以Go语言非常适合项目的开发。
选择Go语言,还有一部分是缘于我的个人崇拜,Go语言的作者不乏鼎鼎大名的牛人:Robert Griesemer、Rob Pike和Ken Thompson,他们曾设计C语言和Unix系统,后来隶属Plan9团队。重要的是,在Go语言的完全开源中,很多名人都参与了进来,使得这个项目越来越完善:Go1.1出来后,性能提升了30-50%,而且GC(垃圾回收机制)已经达到了非常高的水准。相信在开源社区和大牛的共同推动下,Go语言会茁壮成长。
Go Web
我以前是PHP开发者,有十年左右的Web开发经验,但在Go语言的显著优势下,逐渐走向了Go语言的开发之路。我发现Go语言虽然有很强大的网络编程库,但是在Web编程方面没有详细的介绍,也缺少一些比较实用的库,所以结合先前的Web开发经验,以及Go语言本身的网络编程库,开始了这本书的创作过程,希望更多同行能够加入到Go语言的开发行列。
这本书主要分三部分,第一部分是Go语言的基础语法,主要介绍了Go语言的一些语法特性、环境配置和开发工具。第二部分是Web开发,主要介绍了Go Web的基本原理、表单处理、数据库操作、Session和Cookie处理、文本处理、Socket编程、安全加密、国际化和本地化、错误处理和调试、如何部署和维护等知识点,并且针对整个Web开发中需要用到的知识点,结合Go语言代码的原理进行了详细的介绍,针对Go语言在Web开发方面不存在的工具,提供了详细的实现方式。第三部分是应用框架beego,主要介绍了beego框架的设计、实现及应用。目前书中提到的一些功能都可以在我的github找到相应的代码,方便读者进行深入的研究。
这是一本关于Web的书,我觉得特别适合以下几种开发者:
● 如果你是PHP或者其他动态语言爱好者,Go语言不一定能带给你很大的惊喜,因为原来的速度不是根本问题。但如果是类似API应用方面,使用Go语言之后,你会发现性能得到了一个量的提升,这本书中就有详细介绍API开发的实例。
● 如果你是C语言爱好者,强烈建议你学习和使用Go语言。Go语言称为21世纪的C语言,它不仅可以调用C语言程序,又可以提供足够的便利;虽然速度上稍有牺牲,但无关大雅。大部分场景下,Go语言都能带给你与C语言媲美的性能,对于某些确实性能关键的场合,我们也可以通过cgo,让Go语言和C语言搭配使用。
● 如果你是Java爱好者,那么也建议你学习一下Go语言,因为Java能给你的,Go语言能给得更好。
● 如果你是C++爱好者,那么赶紧来看看Go语言吧,因为光学习C++特性的时间,已经可以开发多个Go语言项目了。
致谢
Go社区里的同仁们给了我很大的支持,如果没有他们的反馈和帮助,我就不能顺利完成本书。非常感谢四月份平民、Hong Ruiqi、BianJiang、Oling Cat、Wenlei Wu、polaris、雨痕等网友的热心指导,还有很多github中的贡献者,本书是在大家共同协作努力下才得以完成。
我还要感谢符隆美编辑对我的支持,当我才思枯竭、延期脱稿时,她经常鼓励我、开导我,使我在压力下完成此书并最终出版。
最后要感谢家庭对我的莫大支持,妻子刘玉娟帮我收集资料,帮忙完成了本书的大部分整理工作,儿子们倾听我的思路想法,没有他们,我也没有毅力完成写作,谢谢他们。谢孟军2013年4月于上海推荐序一
很高兴听到谢孟军的《Go Web编程》要出版。当谢孟军找我写推荐序时,尽管工作非常繁忙,我还是一口应承下来了。原因很简单,作为国内首家完全采用Go语言开发的公司,七牛非常乐意见到Go语言社区的繁荣。去年在Google Trends上Golang关键字的搜索指数,中国排在全球首位(比美国多3倍),这是整个中国Go语言社区共同努力的结果。
远在2007年第2届ECUG大会,我讲了《我为什么选择了Erlang》的议题。其中提到了我对未来软件产业趋势的判断:
● 存储与计算向服务端转移
● 从“PC单机”到“强悍的服务器+多元化的终端”(手机、PC、PDA、电视机顶盒、车载终端)
这个趋势判断对我职业生涯的影响非常重大。它促使我放弃了近10年的桌面开发经验(包括大学时期),转向服务端开发。正如我在《我为什么选择了Erlang》中建议的那样:
● 要么就不写程序,要么就写服务器端的程序
● 当然,你也可以去撰写移动终端设备上的代码,在PC平台上做开发的空间很小。
于是,我开始了长达四、五年之久的服务端开发最佳实践的探索。直到有一天,我遇到了Go语言。
我从来不认为自己是一个预言师,但关注过我的人可能都知道,我在新浪微博、《Go语言编程》一书中都非常高调地下了一个论断:Go语言将超过C语言、Java,成为未来十年最流行的语言。
为什么我可以如此坚定地相信,选择Go语言不会有错,并且相信Go语言会成为未来十年最流行的语言?除了Go语言的并发编程模型深得我心外,Go语言的各种语法特性显得那么深思熟虑、卓绝不凡,其对软件系统架构的领悟,让我深觉无法望其项背,处处带给我惊喜。
Go语言给我的第一个惊喜,是大道至简的设计哲学。
Go语言是非常简约的语言。简约的意思是少而精,少就是指数级的多。Go语言极力追求语言特性的最小化,如果某个语法特性只是少写几行代码,但对解决实际问题的难度不会产生本质的影响,那么这样的语法特性就不会被加入。Go语言更关心的是如何解决程序员开发上的心智负担。如何减少代码出错的机会,如何更容易写出高品质的代码,是Go语言设计时极度关心的问题。
Go语言追求显式表达。任何封装都是有漏洞的,最佳的表达方式就是用最直白的表达方式。所以也有人称Go语言为“所写即所得”的语言。
Go语言也是非常追求自然(nature)的语言。Go不只是提供极少的语言特性,并极力追求语言特性最自然的表达,也就是这些语法特性被设计成恰如多少人期望的那样,尽量避免争议。事实上Go语言的语法特性上的争议非常少,这些也让Go语言的入门门槛变得非常低。
Go语言给我的第二个惊喜,是最对胃口的并行支持。
我对服务端开发的探索,始于Erlang语言,并且认为Erlang风格并发模型的精髓是轻量级进程模型。然而Erlang除了语言本身不容易被程序员接受外,其基于进程邮箱做消息传递的并发编程模型也小有瑕疵。我曾经在C++中实现了一个名为CERL的网络库,刚开始在C++中完全模仿Erlang风格的并发编程手法,然而在我拿CERL库做云存储服务的实践中,发现了该编程模型的问题所在并做了相应的调整,这就是后来的CERL 2.0版本。有意思的是,CERL 2.0与Go语言的并行编程思路不谋而合。某种程度上来说,这种默契也是我创办七牛时,Go语言语法特性甚至都还没有完全稳定,我们技术选型就坚决地采纳了Go语言的重要原因。
Go语言给我的第三个惊喜,是interface。
Go语言的interface,并非是你在Java和C#中看到的interface,尽管看起来有点像。Go语言的interface是非侵入式的接口,具体表现在实现一个接口不需要显式地进行声明。不过,让我意外的不是Go语言的非侵入式接口,非侵入式接口只是我接受Go语言的基础。在接口(或契约)的表达上,我一直认为Java和C#这些主流的静态类型语言都走错了方向。C++的模板尽管机制复杂,但是走在了正确的方向上。C++0x(后来的C++11)呼声很高的concept提案被否,着实让不少人伤了心。但Go语言的interface远不是非侵入式接口那么简单,它是Go语言类型系统的纲,这表现在:
1.只要某个类型实现了接口要的方法,那么我们说该类型实现了此接口。该类型的对象可赋值给该接口。
2.作为1的推论,任何Go语言的内置对象都可以赋值给空接口interface{}。
3.支持接口查询。如果你曾经是Windows程序员,你会发现COM思想在Go语言中通过interface优雅呈现。并且Go语言吸收了其中最精华部分,而COM中对象生命周期管理的负担,却因为Go语言基于GC(垃圾回收机制)方式的内存管理而不复存在。
Go语言给我的第四个惊喜,是极度简化但完备的“面向对象编程(OOP)”方法。
Go语言废弃大量的OOP特性,如继承、构造/析构函数、虚函数、函数重载、默认参数等,简化的符号访问权限控制、将隐藏的this指针改为显式定义的receiver对象。Go语言让我看到了OOP编程核心价值原来如此简单——只是多数人都无法看透。
Go语言带给我的第五个惊喜,是它的错误处理规范。
Go语言引入了内置的error类型及defer关键字来编写异常安全代码,让人拍案叫绝。下面这个例子,我在多个场合都提过。
Go语言带给我的第六个惊喜,是它功能的内聚。
一个最典型的案例是Go语言的组合功能。对于多数语言来说,组合只是形成复合类型的基本手段,这一点只要想想C语言的struct就清楚了。但Go语言引入了匿名组合的概念,它让其他语言原本需要引入继承这一新概念来完成事情,统一又到了组合这样的一个基础上。
在C++中,你需要这样定义一个派生类。
在Go语言中你只要
更有甚者,Go语言的匿名组合允许组合一个指针。
这个功能可以实现C++中一个无比晦涩难懂的特性,叫“虚拟继承”。但同样的问题,换从组合角度来表达,直达问题的本质,清晰易懂。
Go语言带给我的第七个惊喜,是消除了堆与栈的边界。
在Go语言之前,程序员是清楚地知道哪些变量在栈上,哪些变量在堆上。堆与栈是基于现代计算机系统的基础工作模型上形成的概念,Go语言屏蔽了变量定义在堆还是栈上这样的物理结构,相当于封装了一个新的计算机工作模型。这一点看似与Go语言显式表达的设计哲学不太一致,但我个人认为这是一项了不起的工作,而且与Go语言的显式表达并不矛盾。Go语言强调的是对开发者的程序逻辑(语义)的显式表达,而非对计算机硬件结构的显示表达。对计算机硬件结构的高度抽象,将更有助于Go语言适应未来计算机硬件发展的变化。
Go语言带给我的第八个惊喜,是Go语言对C语言的支持。
可以这么说,Go语言是除了Objective-C、C++这两门以兼容C为基础目标的语言之外的所有语言中,对C语言支持最友善的一个。什么语言可以直接嵌入C代码?没有,除了Go语言。什么语言可以无缝调用C函数?没有,除了Go语言。对C语言的完美支持,是Go语言快速崛起的关键支撑。还有比C语言更让人觊觎的社区财富么?那是一个取之不尽的金矿。
总而言之,Go语言是一门非常具变革性的语言。尽管这四十多年来(从20世纪七十年代C语言诞生开始算起)出现的语言非常多,各有各的特色,让人眼花缭乱。但是我个人固执地认为,谈得上突破了C语言思想,将编程理念提高到一个新高度的,仅有Go语言而已。
Go语言很简单,但是具备极强的表现力。从目前的状态来说,Go语言主要关注服务器领域的开发,但这不会是Go语言的完整使命。
我们说Go语言适合服务端开发,仅仅是因为它的标准库支持方面,目前是向服务端开发倾斜:
● 网络库(包括socket、http、rpc等)
● 编码库(包括json、xml、gob等)
● 加密库(各种加密算法、摘要算法,极其全面)
● Web(包括template、html支持)
而作为桌面开发的常规组件:GDI和UI系统与事件处理,基本没有涉及。
尽管Go还很年轻,Go语言1.0版本在2012年3月底发布,到现在才1年多,然而Go语言已经得到了非常普遍的认同。在国外,有人甚至提出“Go语言将制霸云计算领域”。在国内,几乎所有你听到过名字的大公司(腾讯、阿里巴巴、京东、360、网易、新浪、金山、豆瓣等等),都有团队对Go做服务端开发进行了小范围的实践。这是不能不说是一个奇迹。
与之相反的是,因为年轻,Go语言的资料,尤其是中文资料极度匮乏。在这样的背景下,《Go Web编程》这样一本有非常强的实践背景的图书出版了,这绝对是雪中送炭。《Go Web编程》围绕做一个Web服务相关的一个个问题域展开:表单处理、数据库、会话(Session)、安全、国际化和本地化、日志、部署与维护。最后,结合作者的实践,本书给出了一个参考的Web编程框架,以简化Web编程,提升开发效率。
无论是对那些只是听过Go语言而打算开始了解的朋友,还是对那些已经进行Go语言开发的朋友,本书都极具参考价值。
另外值得一提的是,除了《Go Web编程》一书外,谢孟军也发起了Go语言标准库文档的翻译工作,这是一项艰苦的工作,但可以预期将对Go语言的发展起到重要作用,读者如果有意为开源贡献自己的一份力量,欢迎你能够积极参与其中。七牛云存储CEO 许式伟2013年4月推荐序二
很早就知道孟军兄在网上写一本关于Go Web编程的书,但是因为各种原因都没缘分仔细去看,最近因为工作原因,也开始接触并使用Go语言,才去看这本书,读完后,便觉得相见恨晚。
本书并不是Go语言的教程,只是在第一章和第二章介绍Go的运行开发环境以及基本语法,但是受益于Go语言自身的简洁性,却也把Go语言的方方面面介绍得非常清楚。
然后介绍Web编程方面的HTTP,Web Server,文本处理,Cookie,Session等知识,同时提到了Web编程中的各种安全问题,比如CSRF、XSS、Session劫持、SQL注入、密码安全等问题,并且给出了Go语言解决方案。
与后台数据库的交互是Web编程中非常重要的环节,本书不仅介绍了MySQL,SQLite,PostgreSQL等传统关系型数据库,同时对MongoDB,Redis这两位NoSQL阵营的明星产品也有涉及,但最值得一提的是,作者编写的开源Go语言ORM库。一提到Web编程,我们马上想到的是PHP、Python、Ruby等动态语言以及基于这些语言的各种框架,如PHP阵营的Zend Framework,Python阵营的Django,Ruby阵营的Ruby On Rails,诚然,动态语言的特性加速了我们的开发效率,但是框架带来的便利与高效才是至关重要的,这点我们从Spring,Hibernate等框架对Java社区的重要性就可以看出。其中ORM是框架中非常重要的一部分,它帮开发者隐藏了繁琐的SQL细节,非常轻松地完成数据库的增删改查。作者开源的Go语言的ORM库功能已经相对完整,算是我国Go语言社区里开源的精品之作了,能有效提高使用Go语言进行Web开发的效率,虽然也存在需要提高改进的地方,但合抱之木生于毫末,九层之台起于累土,千里之行始于足下,只要坚持不懈,持续改进,未尝没有像Spring一样成为全球知名框架的可能。
本书的最后,还介绍了如何进行国际化与本地化的Web开发,讲解了如何调试、部署和维护方面的实践,提出了设计可扩展Web框架的建议。
本书以Web编程为主线,讲解了开发、测试、设计和部署等方面需要的知识,涵盖了一个Web站开发生命周期的方方面面,不仅是希望用Go语言开发Web服务的读者会受益匪浅,而且用其他语言的读者对Web编程的概念也会有清晰的认识。
Go语言目标是成为集合解释型编程的轻松、动态类型语言的高效及静态类型语言的安全三大优点的编译型语言,同时它对网络编程与多核计算支持非常好。在国内外,都已经有大型的IT公司在内部试水使用Go语言开发各种服务,其中也有不少成功案例。在技术社区,也有很多人开始宣传Go,使用Go,关注Go,相信在不久的将来,会有更多的人来使用Go语言来开发他们的Web服务,因为Go语言确实非常优秀而且实用。京东商城云平台资深工程师,高级经理 郭理靖2013年4月第1章 Go语言环境配置
欢迎来到Go语言的世界,让我们开始探索吧!
Go语言是一种并发的、带垃圾回收的、快速编译的新语言。它具有以下特点:
● 可以在一台计算机上仅用几秒钟的时间编译一个大型的Go语言程序。
● Go语言为软件构造提供了一种模型,它使依赖分析更加容易,且避免了大部分C语言风格include文件与库的开头。
● Go语言是静态类型的语言,它的类型系统没有层级。因此,用户不需要在定义类型之间的关系上花费时间,看似比典型的面向对象语言更轻量级。
● Go语言完全是垃圾回收型的语言,而且为并发执行与通信提供了基本的支持。
● Go语言是一种云计算时代的语言,它能够充分利用计算机的多核,通过轻量级别的goroutine就可以实现多并发。
Go语言是一种编译型语言,它结合了解释型语言的游刃有余,动态类型语言的开发效率,以及静态类型的安全性。它也打算成为现代的、支持网络与多核计算的语言。要满足这些目标,需要解决一些语言上的问题:一个富有表达能力但轻量级的类型系统,并发与垃圾回收机制,严格的依赖规范等。这些问题无法通过库或工具解决,因此,Go语言应运而生。
我们将在本章讲述Go语言的安装方法,以及如何配置项目信息。1.1 Go语言安装
Go语言的三种安装方式
Go语言有多种安装方式,你可以选择自己喜欢的。下面介绍三种最常见的安装方式。
● Go语言源码安装:这是一种标准的软件安装方式。对于经常使用UNIX类系统的用户,尤其对于开发者来说,从源码安装是最方便的。
● Go语言标准包安装:Go语言提供了方便的安装包,支持Windows、Linux、Mac等系统。这种方式适合初学者,可根据自己的系统位数下载好相应的安装包,一直单击“next”就可以轻松安装了。
● 第三方工具安装:目前有很多方便的第三方软件包工具,例如Ubuntu的apt-get、Mac的homebrew等。这种安装方式适合那些熟悉相应系统的用户。
最后,如果你想在同一个系统中安装多个版本的Go语言,你可以参考第三方工具GVM(https://github.com/moovweb/gvm),这是目前在该方面做得最好的工具。
Go语言源码安装
在Go语言的源代码中,有些部分是用Plan 9 C和AT&T汇编写的,因此,假如你想从源码安装,就必须安装C的编译工具。
在Mac系统中,只要你安装了Xcode,就已经包含了相应的编译工具。
在类UNIX系统中,需要安装gcc等工具。例如Ubuntu系统可通过在终端中执行sudo apt-get install gcc libc6-dev来安装编译工具。
在Windows系统中,你需要安装MinGW,然后通过MinGW安装gcc,并设置相应的环境变量。
Go语言使用Mercurial进行版本管理,首先你必须先安装Mercurial,然后才能下载。假设你已经安装好Mercurial,确定你目前已经位于Go语言的安装目录$GO_ INSTALL_DIR下,执行如下代码:
运行all.bash后,出现“ALL TESTS PASSED”字样时才算安装成功。
上面是UNIX风格的命令,Windows下的安装方式类似,只不过是运行all.bat,调用的编译器是MinGW的gcc。
然后设置以下几个环境变量:
看到如图1.1所示的图片,说明你已经安装成功。图1.1 源码安装之后执行Go语言命令的图
如果出现Go语言的Usage信息,那么说明Go语言已经安装成功;如果出现该命令不存在,那么可以检查一下你的PATH环境变量中是否包含了Go语言的安装目录。
Go语言标准包安装
Go语言提供了每个平台打好包的一键安装,这些包默认会安装到如下目录:/usr/local/go(Windows系统:c:\Go语言),当然你可以改变它们的安装位置,但是改变之后,你必须在你的环境变量中设置如下信息。
如何判断自己的操作系统是32位还是64位
Go语言安装需要判断操作系统的位数,所以下面先确定自己的系统类型。
Windows系统用户请按Win+R组合键运行cmd,输入systeminfo后按回车键,稍等片刻,会出现一些系统信息。在“系统类型”一行中,若显示“x64-based PC”,即为64位系统;若显示“X86-based PC”,则为32位系统。
Mac系统用户建议直接使用64位系统,因为Go语言所支持的Mac OS X版本已经不支持纯32位处理器了。
Linux系统用户可通过在Terminal中执行命令uname -a来查看系统信息。
64位系统显示
32位系统显示
Mac安装
访问http://code.google.com/p/go/downloads/list,32位系统下载go1.0.3.darwin-386.pkg,64位系统下载go1.0.3.darwin-amd64.pkg,双击下载文件,按照默认一直单击“下一步”按钮,这时Go语言已经安装好,默认在PATH中增加了相应的~/go/bin,这时打开终端,输入go,看到类似图1.1源码安装成功的图片后说明已经安装成功。
如果出现Go语言的Usage信息,那么说明Go语言已经安装成功;如果出现该命令不存在,那么可以检查一下自己的PATH环境变量中是否包含了Go语言的安装目录。
Linux安装
访问http://code.google.com/p/go/downloads/list,32位系统下载go1.0.3.linux-386.tar.gz,64位系统下载go1.0.3.linux-amd64.tar.gz,假定你想安装Go语言的目录为$GO_ INSTALL_DIR,那么就替换为相应的目录路径。
解压缩tar.gz包到安装目录下:tar zxvf go1.0.3.linux-amd64.tar.gz -C $GO_INSTALL_DIR。
设置PATH,export PATH=$PATH:$GO_INSTALL_DIR/go/bin,然后执行go,显示如图1-2所示。图1.2 Linux系统下安装成功之后执行go显示的信息
如果出现Go语言的Usage信息,那么说明Go已经安装成功了;如果提示该命令不存在,那么可以检查一下自己的PATH环境变量中是否包含了Go语言的安装目录。
Windows安装
访问http://code.google.com/p/go/downloads/list,32位系统下载go1.0.3.windows-386. msi,64位系统下载go1.0.3.windows-amd64.msi。双击打开下载的文件,按照默认一直单击“下一步”按钮,这时Go语言已经安装到你的系统中,默认安装之后,你的系统环境变量中加入了c:/go/bin,这个时候打开cmd,输入go,看到类似图1.2所示的安装成功的显示,说明已经安装成功。
如果出现Go语言的Usage信息,那么说明Go语言已经安装成功;如果出现该命令不存在,那么可以检查一下自己的PATH环境变量中是否包含了Go语言的安装目录。
第三方工具安装
GVM
GVM是第三方开发的Go语言多版本管理工具,类似ruby里面的rvm工具。使用非常方便,安装GVM使用如下命令。
安装完成后,我们就可以安装go。
执行完上面的命令之后,GOPATH、GOROOT等环境变量会自动设置好,这样就可以直接使用了。
apt-get
Ubuntu是目前使用最多的Linux桌面系统,使用apt-get命令来管理软件包,我们可以通过下面的命令来安装go。
homebrew
homebrew是Mac系统下目前使用最多的管理软件的工具,目前已支持Go语言,可以通过命令直接安装go。1.2 GOPATH与工作空间
GOPATH设置①
go命令依赖一个重要的环境变量:$GOPATH
在类似UNIX环境设置如下。
Windows设置如下,新建一个环境变量名称叫做GOPATH。
GOPATH允许多个目录,当有多个目录时,请注意分隔符,多个GOPATH的时候,Windows系统是分号,Linux系统是冒号,当有多个GOPATH时,默认将go get的内容放在第一个目录下。
以上$GOPATH目录约定有三个子目录。
● src存放源代码(比如:.go、.c、.h、.s等)。
● pkg编译后生成的文件(比如:.a)。
● bin编译后生成的可执行文件(为了方便,可以把此目录加入到$PATH变量中)。
本书中所有的例子都是以mygo作为笔者的GOPATH目录。
应用目录结构
建立包和目录:$GOPATH/src/mymath/sqrt.go(包名:“mymath”)
本书中新建应用或者一个代码包都是在src目录下新建一个文件夹,文件夹名称一般是代码包名称,当然也允许多级目录,例如,在src下面新建了目录。$GOPATH/src/ github.com/astaxie/beedb这个包名称就是“github.com/astaxie/beedb”,即最后一个目录。
执行如下代码。
新建文件sqrt.go,内容如下。
这样笔者的应用包目录和代码已经新建完毕,注意:一般建议package的名称和目录名保持一致。
编译应用
上面我们已经建立了自己的应用包,如何进行编译安装呢?有两种方式可以进行安装。
1.只要进入对应的应用包目录,然后执行go install,即可安装。
2.在任意的目录下执行代码go install mymath。
安装完之后,我们可以进入如下目录。
这个.a文件是应用包,如何调用呢?接下来,我们新建一个应用程序来调用。
新建应用包mathapp。
如何编译程序呢?进入该应用目录,然后执行go build,那么在该目录下面会生成一个mathapp的可执行文件:
输出如下内容。
如何安装该应用?进入该目录执行go install,在$GOPATH/bin/下增加了一个可执行文件mathapp,在命令行输入如下命令就可以执行。
输出如下内容。
获取远程包
Go语言有一个获取远程包的工具就是go get,目前go get支持多数开源社区(例如:github、googlecode、bitbucket、Launchpad)。
通过这个命令可以获取相应的源码,对应的开源平台采用不同的源码控制工具,例如,github采用git,googlecode采用hg,所以要想获取这些源码,必须先安装相应的源码控制工具。
通过go get获取的代码在我们本地的源码结构如下。
go get本质上可以理解为:首先通过源码工具clone代码到src目录,然后执行go install。
在代码中如何使用远程包?很简单,就是和使用本地包一样,只要在开头import相应的路径即可。
程序的整体结构
通过上面建立的笔者本地mygo的目录结构如下。
从上面的结构我们可以很清晰地看到,bin目录下面存放的是编译之后可执行的文件,pkg下面存放的是函数包,src下面保存的是应用源代码。
试读结束[说明:试读内容隐藏了图片]