Go是一门为云计算而生的编程语言。不仅是国外的Google、AWS,国内的阿里、今日头条等公司也已经开始大规模使用Go来开发重要的项目,由于CloudFlare、Cockroach Labs、DigitalOcean、Docker、InfluxData、 Iron.io、Let’s Encrypt、Light Code Labs、Red Hat CoreOS、SendGrid 这样的公司以及云原生计算基金会(Cloud Native Computing Foundation)等组织的推动,许多 Web 底层基础设施正在陆续迁移至Go之上。
Go语言特点就是简单易学,从而形成了一种有偏向性的编程风格——go style。其风格贯穿了Go语言的所有项目,减少了在配置lint规则和学习不同编程风格所花费的时间。
1.什么是Go
Go是一门编译语言。在运行程序之前,Go首先需要使用编译器将用户编写的代码转换为计算机能够理解的0和1。为了便于执行和分发,Go编译器还会把所有代码整合并编译成一个单独的可执行文件。在编译的过程中,Go编译器能够捕捉到程序中包括拼写错误在内的一些人为失误。
并非所有编程语言都需要编译才能运行,如Python、Ruby和其他一些流行语言就选择了在程序运行的时候,通过解释器一条接一条地转化代码中的声明,但这也意味着bug可能会隐藏在测试尚未触及的代码当中。
不过换个角度来看,解释器不仅能够让开发过程变得迅速且具有交互性,还能够让语言本身变得灵活、轻松和令人愉快。相反,编译语言却常常因为像机器人一样顽固不化、墨守成规而广为人知,并且缓慢的编译速度也常常为人所诟病,然而实际上并非所有编译语言都是如此。
我们想要构造出这样一种语言,它不仅可以像C++和Java这类静态编译语言一样安全、高效,还可以像Python这类动态类型解释语言一样轻巧且充满乐趣。
——James Gosling,Java: an Overview
Java避免了C++当中许多不常见、难懂和令人迷惑的特性,根据我们的经验,这些特性带来的麻烦要比好处多得多。
Go在考虑软件开发的体验方面可谓煞费苦心。首先,即使是大型程序的编译也可以在极短的时间内完成,并且只需要用到一条命令。其次,Go语言排除了那些可能会导致歧义的特性,鼓励可预测和简明易懂的代码。最后,Go为Java等传统语言死板的数据结构提供了轻量级的替代品。
——James Gosling,Java: an Overview
Go不仅像解释语言一样简单和有趣,还在性能和可靠性上占有优势,并且由于Go是一门只包含几种简单概念的小型语言,所以学习起来也相对较快。综上所述,我们得出以下Go箴言:
Go是一门开源编程语言,使用它可以大规模地生产出简单、高效且可信赖的软件。
每一种新的编程语言都会对以往想法进行改良。与早期语言相比,在Go里面高效地使用内存将变得更为容易,出错的可能性也更低,并且Go还能利用多核机器上的每个核心获得额外的性能优势。很多成功案例都会把性能提升列举为转向Go的其中一个原因。例如,Iron.io只用了2台Go服务器就替换了他们原来使用的30台Ruby服务器;而Bitly在使用Go重写原有的Python应用程序之后也获得了持续、可测量的性能提升,这导致他们在之后把自己的C应用程序也“更新换代”成了相应的Go版本。
——Go品牌手册
2.Go Playground
学习Go语言最快捷的方式就是使用Go Playground,这个工具可以让你在无须安装任何软件的情况下直接编辑、运行和试验Go程序。当你点击Go Playground 中的 Run(运行)按钮的时候,Go Playground就会在谷歌公司的服务器上编译并执行你输入的代码,然后在屏幕上显示执行代码的结果。
点击Go Playground中的Share(分享)按钮可以获得一个访问当前代码的链接。你可以通过这个链接把自己的代码分享给朋友,或者将其用作浏览器书签以便保存工作进度。
3.包和函数
当我们访问 Go Playground 的时候将会看到代码清单 1-1 所示的代码,它作为学习Go语言的起点真的再合适不过了。
代码清单 1-1 与 Go Playground 的初次见面:
尽管这段代码非常简短,但它引入了package、import 和func这 3 个非常重要的关键字,这些保留的关键字都有它们各自的特殊目的。
package关键字声明了代码所属的包,在本例中这个包的名字就是main。所有用Go编写的代码都会被组织成各式各样的包,并且每个包都对应一个单独的构想,例如,Go语言本身就提供了一个面向数学、压缩、加密、图像处理等领域的标准库。
在 package 关键字之后,代码使用了import 关键字来导入自己将要用到的包。一个包可以包含任意数量的函数。例如,math 包提供了诸如Sin、Cos、Tan和 Sqrt等函数,而此处用到的fmt包则提供了用于格式化输入和输出的函数。因为在屏幕上显示文本是一个非常常用的操作,所以 Go 使用了缩写 fmt 作为包名。gopher 通常把这个包的名字读作“FŌŌMT!”,给人的感觉仿佛这个库是使用漫画书上的大爆炸字体撰写的一样。
func关键字用于声明函数,在本例中这个函数的名字就是main。每个函数的体(body)都需要使用大括号{}包围,这样Go才能知道每个函数从何处开始,又在何处结束。
main这一标识符(identifier)具有特殊意义。当我们运行一个Go程序的时候,它总是从main包的main函数开始运行。如果main不存在,那么Go编译器将报告一个错误,因为它无法得知程序应该从何处开始执行。
为了打印出一个由文本组成的行,例子中的代码使用了Println函数(其中 ln 为英文 line 的缩写)。每次用到被导入包中的某个函数时,我们都需要在函数的名字前面加上包的名字以及一个点号作为前缀。例如,代码清单 1-1 中的Println函数前面就带有fmt后跟一个点号作为前缀,这是因为Println函数就是由被导入的 fmt 包提供的。Go的这一特性可以让用户在阅读代码的时候立即弄清楚各个函数分别来自哪个包。
当我们按下 Go Playground 中的Run按钮时,代码中被引号包围的文本将输出至屏幕,最终使得文本“Hello, playground”出现在 Go Playground 中的输出区域中。对英语来说,即使缺少一个逗号也有可能使整个句子的意义变得完全不同。同样,标点符号对编程语言来说也是至关重要的。例如,Go就需要依靠引号、圆括号和大括号等符号来理解用户输入的代码。
4.唯一允许的大括号放置风格
Go对于大括号{}的摆放位置非常挑剔。在代码清单 1-1 中,左大括号{与 func 关键字位于同一行,而右大括号}则独占一行。这是 Go语言唯一允许的大括号放置风格,除此之外的其他大括号放置风格都是不被允许的。
Go之所以如此严格地限制大括号的放置风格,与这门语言刚刚诞生时出现的一些情况有关。在早期,使用Go编写的代码总是无一幸免地带有分号,它们就像迷路的小狗一样跟在每条单独的语句后面,例如:
fmt.Println(“Hello, fire hydrant”);
到了 2009 年 12 月,一群“忍者”gopher 决定把分号从语言中驱逐出去。好吧,这么说也不太准确。实际上,Go编译器将为你代劳,自动地插入那些可爱的分号。这种机制运行得非常完美,但它的代价就是要求用户必须遵守上面提到的唯一允许的大括号放置风格。
如果用户尝试将左大括号和 func关键字放在不同的行里面,那么 Go编译器将报告一个语法错误:
func main( ←— 函数体缺失{ ←— 语法错误:在{之前发现了意料之外的分号或新行}
出现这个问题并不是编译器有意刁难,而是由于分号被插到了错误的位置,导致编译器犯了点儿小迷糊,最终才不得不求助于你。
书籍简介
无论你是打算使用 Go编写大型的并发Web服务,还是只想用Go编写小型脚本和简单的工具,本书都会帮助你打下坚实的基础。
GO语言趣学指南
作者: [加] 内森•扬曼 [英] 罗杰•佩珀
译者: 黄健宏
这本书是抢读版图书,本书作者Nathan Youngman是一位自学成才的网络开发人员和终身学习者,他担任Edmonton Go大会的组织者,是加拿大代码学习的导师。
这本面向Go语言初学者的书,书中循序渐进地介绍了使用Go语言必需知道的知识,展示了非常多生动有趣的例子,并通过提供大量练习来加深读者对书中所述内容的理解。
本书共分8个单元,核心内容包括7个单元,分别介绍变量、常量、分支和循环等基础语句,整数、浮点数和字符串等常用类型,类型、函数和方法,数组、切片和映射,结构和接口,指针、nil和错误处理方法,并发和状态保护,并且每个单元都包含相应的大章和单元测试。
-END-