知识&技术&梦想 知识&技术&梦想

Go语言教程 - 1

本篇文章简要的介绍一下Go(Golang)语言的一些语言特性和发展历史. 让你能够对Go有个简单的认识. 语言简史 提起Go语言的出身,我们就必须将我们饱含敬意的眼光投向持续推出惊世骇俗成果的贝尔实验室。贝尔实验室已经走出了多位诺贝尔奖获得者,一些对于现在科技至关重要的研究成果,比如晶体管、通信技术、数码相机的感光元件CCD和光电池等都源自贝尔实验室。该实验室在科技界的地位可想而之,是一个毫无争议的科研圣地。 这里我们重点介绍一下贝尔实验室中一个叫计算科学研究中心的部门对于操作系统和编程语言的贡献。回溯至1969年(估计大部分读者那时候都还没出世),肯·汤普逊(Ken Thompson)和丹尼斯·里奇(Dennis Ritchie)在贝尔实验室的计算科学研究中心里开发出了Unix这个大名鼎鼎的操作系统,还因为开发Unix而衍生出了一门同样赫赫有名的编程语言——C语言。对于很大一部分人而言, Unix就是操作系统的鼻祖, C语言也是计算机课程中最广泛使用的编程语言。 Unix和C语言在过去的几十年以来已经造就了无数的成功商业故事,比如曾在90年代如日中天的太阳微系统(Sun MicroSystems),现在正如日中天的苹果的Mac OS X操作系统其实也可以认为是Unix 的一个变种(FreeBSD)。 虽然已经取得了如此巨大的成就,贝尔实验室的这几个人并没有因此而沉浸在光环中止步不前,他们从20世纪80年代又开始了一个名为Plan 9的操作系统研究项目,目的就是解决Unix中的一些问题,发展出一个Unix的后续替代系统。在之后的几十年中,该研究项目又演变出了另一个叫Inferno的项目分支,以及一个名为Limbo的编程语言。 Limbo是用于开发运行在小型计算机上的分布式应用的编程语言,它支持模块化编程,编译期和运行时的强类型检查,进程内基于具有类型的通信通道,原子性垃圾收集和简单的抽象数据类型。它被设计为:即便是在没有硬件内存保护的小型设备上,也能安全运行。 Limbo语言被认为是Go语言的前身,不仅仅因为是同一批人设计的语言,而是Go语言确实从Limbo语言中继承了众多优秀的特性。 贝尔实验室后来经历了多次的动荡,包括肯·汤普逊在内的Plan 9项目原班人马加入了Google。在Google,他们创造了Go语言。早在2007年9月, Go语言还是这帮大牛的20%自由时间的实验项目。幸运的是,到了2008年5月,Google发现了Go语言的巨大潜力,从而开始全力支持这个项目,让这批人可以全身心投入Go语言的设计和开发工作中。 Go语言的第一个版本在2009年11月正式对外发布,并在此后的两年内快速迭代,发展迅猛。第一个正式版本的 Go语言于2012年3月28日正式发布,让Go语言迎来了第一个引人瞩目的里程碑。 基于Google对开源的一贯拥抱态度, Go语言也自然而然地选择了开源方式发布, 并使用BSD授权协议。任何人可以查看Go语言的所有源代码,并可以为Go语言发展而奉献自己的力量。 Google作为Go语言的主推者,并没有简简单单地把语言推给开源社区了事,它不仅组建了一个独立的小组全职开发Go语言,还在自家的服务中逐步增加对Go语言的支持,比如对于Google有战略意义的云计算平台GAE(Google AppEngine)很早就开始支持Go语言了。按目前的发展态势,在Google内部, Go语言有逐渐取代Java和Python主流地位的趋势。在Google的更多产品中,我们将看到Go语言的踪影,比如Google最核心的搜索和广告业务。 我们已经清晰诠释了为什么在语言泛滥的时代Google还要设计和推出一门新的编程语言。按照已经发布的Go语言的特性,我们有足够的理由相信Google推出此门新编程语言绝不仅仅是简单的跑马圈地运动,而是为了解决切实的问题。 下面我们再来看看Go语言的主要作者。 1. 肯·汤普逊(Ken Thompson, http://en.wikipedia.org/wiki/Ken_Thompson):设计了B语言 和C语言,创建了Unix和Plan 9操作系统, 1983年图灵奖得主, Go语言的共同作者。 2. 罗布·派克(Rob Pike, http://en.wikipedia.org/wiki/Rob_Pike): Unix小组的成员,参与Plan9和Inferno操作系统,参与 Limbo和Go语言的研发,《Unix编程环境》作者之一。 3. 罗伯特·格里泽默(Robert Griesemer):曾协助制作Java的HotSpot编译器和Chrome浏览 器的JavaScript引擎V8。 4. 拉斯·考克斯(Russ Cox,http://swtch.com/~rsc/):参与Plan 9操作系统的开发,Google CodeSearch项目负责人。 5. 伊安·泰勒(Ian Lance Taylor): GCC社区的活跃人物, gold连接器和GCC过程间优化LTO 的主要设计者, Zembu公司的创始人。 6. 布拉德·菲茨帕特里克(Brad Fitzpatrick, ttp://en.wikipedia.org/wiki/Brad_Fitzpatrick): LiveJournal的创始人,著名开源项目memcached的作者。 虽然我们这里只列出了一部分,大家已经可以看出这个语言开发团队空前强大,这让我们在 为Go语言的优秀特性而兴奋之外,还非常看好这门语言的发展前景 语言特性: Go语言作为一门全新的静态类型开发语言,与当前的开发语言相比具备众多令人兴奋不已 的新特性。本书从第2章开始,我们将对Go语言的各个方面进行详细解析,让读者能够尽量轻松 地掌握这门简洁、有趣却又超级强大的新语言。 这里罗列一下Go语言最主要的特性: 自动垃圾回收 更丰富的内置类型 函数多返回值 错误处理 匿名函数和闭包 类型和接口 并发编程 反射 语言交互性 第一个 Go 程序 自Kernighan和Ritchie合著的《C程序设计语言》(The C Programming Language)出版以来,几乎所有的编程书都以一个Hello world小例子作为开始。我们也不免俗(或者说尊重传统),下面我们从一个简单Go语言版本的Hello world来初窥Go这门新语言的模样.
package main
import "fmt"// 我们需要使用fmt包中的Println()函数
func main() {
    fmt.Println("Hello, world. 你好,世界! ")
}
代码解读 每个Go源代码文件的开头都是一个package声明,表示该Go代码所属的包。包是Go语言里最基本的分发单位,也是工程管理中依赖关系的体现。要生成Go可执行程序,必须建立一个名字为main的包,并且在该包中包含一个叫main()的函数(该函数是Go可执行程序的执行起点)。 Go语言的main()函数不能带参数,也不能定义返回值。命令行传入的参数在os.Args变量中保存。如果需要支持命令行开关,可使用flag包。在本书后面我们将解释如何使用flag包来做命令行参数规范的定义,以及获取和解析命令行参数。 在包声明之后,是一系列的import语句,用于导入该程序所依赖的包。由于本示例程序用到了Println()函数,所以需要导入该函数所属的fmt包。 有一点需要注意,不得包含在源代码文件中没有用到的包,否则Go编译器会报编译错误。 这与下面提到的强制左花括号{的放置位置以及之后会提到的函数名的大小写规则,均体现了Go 语言在语言层面解决软件工程问题的设计哲学。 所有Go函数(包括在对象编程中会提到的类型成员函数)以关键字func开头。一个常规的 函数定义包含以下部分:
func 函数名(参数列表)(返回值列表) {
    // 函数体
}
对应的一个实例如下:
func Compute(value1 int, value2 float64)(result float64, err error) {
    // 函数体
}
Go支持多个返回值。以上的示例函数Compute()返回了两个值,一个叫result,另一个是 err。并不是所有返回值都必须赋值。在函数返回时没有被明确赋值的返回值都会被设置为默认 值,比如result会被设为0.0, err会被设为nil。 Go程序的代码注释与C++保持一致,即同时支持以下两种用法:
/*
块注释
*/
// 行注释
相信熟悉C和C++的读者也发现了另外一点,即在这段Go示例代码里没有出现分号。 Go 程序并不要求开发者在每个语句后面加上分号表示语句结束,这是与C和C++的一个明显不同 之处。 有些开发人员可能会自然地把左花括号{另起一行放置,这样做的结果是Go编译器报告编译错 误,这点需要特别注意:
syntax error: unexpected semicolon or newline before {
大纲