第一章 GO语言介绍

一、GO语言的诞生

1.大维度分析

#1、近几十年来,计算机硬件飞速发展,硬件越来越廉价,并且硬件性能/抗并发能力不断攀升,超线程技术、CPU 多核化的发展和普及为并行计算提供了技术支持与编程需求,但是反观编程语言领域却没有什么大的动作,很早就诞生了C/C++在计算机领域发展的也不并好,也就是说,并没有一门专门为这个时代的硬件而生的编程语言

#2、旧的编程语言无法在开发效率与执行效率之间做出很好的平衡
要么执行效率高,开发效率低、编译速度慢,如C++;
要么么执行效率低,但拥有高效的编译,如.NET、Java;
总之。go出现之前的语言在执行效率和开发效率上都不能做到鱼与熊掌兼得,如下所示
- 执行效率 execution speed: C/C++ > Java > Python
- 开发效率 developing efficiency: Python > Java > C/C++
所以,一门同时拥有高效的执行速度、编译速度和开发速度的编程语言呼之欲出,这就是Go语言诞生的前戏与大环境

2.具体问题分析

面对主流编程语言,开发者不得不在其简洁性/开发效率、编译和运行的高效性、代码的可读性、类型系统的轻量性等方面纠结徘徊,或者像 Google 一样采取多语言并用的策略。但是,随着项目规模的不断扩大,开发和维护的复杂性也正在把Google公司一步一步拖入泥潭中......

时间回溯到 2007 年,那个时候,GitHub 还未问世,Intel 也才在前一年刚推出自家的第一个多核微处理器 Core 2(微处理器,简单来说,就是将 CPU 的所有元件都放入同一块芯片中的东东)。彼时的 Google 已然成长为一家全球科技巨头,与之相随的便是行数与复杂度不断增长的代码量,Google公司开发遇到了棘手的问题。。。。。。 - 系统越来越复杂 大量的代码是由C++、Java,并辅以 Python 写成 - 规模越来越庞大 成千上万的工程师每天都在围绕着数以万计行的代码及其分布式的编译系统、数百万的服务器工作着 以保证各项服务的正常运行

面对如此庞大的开发规模,人才济济的谷歌虽然通过各种技术手段得以“逆风飞翔”,但是此种状态却带来了慢速、低效,甚至稍显笨拙的开发体验。随着系统进一步复杂、规模进一步庞大,下述痛点也都在进一步被放大: - 编译慢 - 失控的依赖 - 每个工程师只是用了一个语言里面的一部分 - 程序难以维护(可读性差、文档不清晰等) - 更新的花费越来越长 - 交叉编译困难

3.如何解决问题

正遭遇上述问题的 Google 工程师们开始坐立不安了,他们一边对现状充满沮丧,一边回望过去,沉思良久,希望搞明白问题所在。这些在计算机语言领域已深耕多年,富有经验的工程师们意识到,不能简单地通过现有语言的单个特性,或添加某些库就能很好地解决现存问题,站在软件工程的更高角度,顺应技术的发展创造一门全新的语言才是当下亟需要做的事情。

于是,谷歌公司的三位工程师于 2007 年 9 月 20 号下午进行一次讨论,正是这次讨论才有了第二天组织在位于加利福尼亚的山景城 43 号楼的三人会议。没错,与会的三人 Robert Griesemer,Rob Pike 和 Ken Thompson 就是 Go 的创始人,他们均在 Google 任职,其中的 Ken 就是那个发明了 UNIX、B语言的神一样的男子。

#1.罗伯特·格瑞史莫(Robert Griesemer) 
Robert Griesemer is an employee of Google and one of the initial designers of the Go programming language. Prior to Go, Robert has worked on code generation for Google’s V8 JavaScript engine and Chubby,[1] a distributed lock manager for Google’s GFS distributed filesystem. He has also worked on the design and implementation of the domain-specific language Sawzall, the Java HotSpot virtual machine, and the Strongtalk system. He has also written a vectorizing compiler for the Cray Y-MP and an interpreter for APL.

#2.罗勃特·派克(Rob Pike) 
昵称为罗勃·派克(Rob Pike),来自加拿大的程序员,曾经加入贝尔实验室,为 UNIX小组的成员。曾经参与过贝尔实验室九号计划、Inferno,与编程语言 Limbo的开发。他与肯·汤普逊共同开发了UTF-8。

#3.肯尼斯·汤普逊(Ken Thompson) 
肯·汤普逊(英语:Ken Thompson),是美国计算机科学学者和工程师。黑客文化圈子通常称他为“ken”[1]。在贝尔实验室工作期间,汤普逊设计和实现了Unix操作系统。他创造了B语言——C语言的前身,而且他是Plan 9操作系统的创造者和开发者之一。2006年,汤普逊进入Google公司工作,与他人共同设计了Go语言。他与丹尼斯·里奇同为1983年图灵奖得主。 
此外,肯·汤普逊还参与过正则表达式和UTF-8编码的设计,改进了文本编辑器QED,创造了ed编辑器。他曾制造过专门用于下国际象棋的电脑“Belle”,并创建了残局数据库。

刚开始,三位神仙只是一些有一些想法和愿望,但隶属行动派的三人数日之内就敲定了目标和接下来要做的事情,

- 1、Go希望成为互联网时代的C语言。多数系统级语言(包括Java和C#)的根本编程哲学来源于C++,并将C++的面向对象进一步发扬光大。但是Go语言的设计者却有不同的看法,他们认为值得学习的是C语言。C语言经久不衰的根源是它足够简单。因此,Go语言也是足够简单。

- 2、所以,他们当时设计Go的目标是为了消除各种缓慢和笨重、改进各种低效和扩展性。Go是由那些开发大型系统的人设计的,同时也是为了这些人服务的;它是为了解决工程上的问题,不是为了研究语言设计;它还是为了让我们的编程变得更舒适和方便。

- 3、但是结合Google当时内部的一些现实情况,如很多工程师都是C系的,所以新设计的语言一定要易学习,最好是类似C的语言;20年没有出新的语言了,所以新设计的语言必须是现代化的(例如内置GC)等情况。

最后根据实战经验,他们向着既定的目标开始设计Go语言。。。

在他们的第 1 封有关语言设计的邮件列表中,这门语言的名称 “Go” 就已初漏端倪:

Subject: Re:prog lang discussion From: Rob 'Commander' Pike

Date:Tue,Sep25,2007at3:12PM To:Robert Griesemer, Ken Thompson

i had a couple of thoughts on the drive home.

1.name

'go' you can invent reasons for this name but it has nice properties. it's short, easy to type. tools: goc, gol, goa. if there's an interactive debugger/interpreter it could just be called 'go'. the suffix is .go

Go VS Golang由于 Google 在注册 Go 的官网域名时,go.org已被迪士尼抢注,golang.org才得以“上位”,这也就产生了很多人误以为Golang就是其正式名称的误会,而事实却恰恰相反,我们可以认为Golang只是Go的绰号。

得益于Google公司良好的企业文化,允许工程师拿出20%的时间来研究自己喜欢的项目。语音服务Google Now、谷歌新闻Google News、谷歌地图Google Map上的交通信息等,全都是20%时间的产物,Go语言最开始也是20%时间的产物。在接下来的日子里,Go 的设计等相关工作始终以兼职的形式进行着。直到 2008 年年中,Go 项目才正式“转正”,成为一个全职项目。

此间,第一件令人惊喜的事就来自那三位创始人收到的这份邮件:

Subject: A gcc frontend for Go

From:Ian Lance Taylor

Date:Sat,Jun7,2008at7:06PM

To: Robert Griesemer, Rob Pike, Ken Thompson

One of my office-mates pointed me at http://.../go_lang.html .It seems like an interesting language, and I threw together a gcc frontend for it. It's missing a lot of features, of course, but it does compile the prime sieve code on the web page.

邮件中 Ian (全名Ian Lance Taylor,GCC核心开发人员)讲到自己为 Go 实现了一个能进行语法分析、词法分析和语义分析的 gcc 前端编译组件。后来,Ian 也成为了 Go 的核心开发人员。

2008 年末,另一位技术大神 Russ Cox(曾参与Plan 9 操作系统的开发) 也加入到了 Go 开发团队。在他的助攻下,Go 语言和标准库从原型变成了现实。

后来还加入了Brand Fitzpatrick(memcached的作者)

Go创始团队的神仙阵容,标志着Go语言的创始团队对操作系统和系统编程有着非常深刻的理解,这对一门语言的开发起到至关重要的作用。

2009 年 11 月 10 号,Go 宣布开源,这一天也被选定为 Go 的生日 。

2012 年 3 月,Go version 1 正式发布,这标志着 Go 作为一门全新的编程设计语言已可投身生产,根据 Go 的 兼容性原则,我们可以放心地使用它编写简单、高效、稳定可靠的应用了。

二、GO语言简介

1.GO语言介绍

Go 即Golang,是Google公司2009年11月正式对外公开的一门编程语言。

Go是静态强类型语言,是区别于解析型语言的编译型语言。

解析型语言——源代码是先翻译为中间代码,然后由解析器对代码进行解释执行。

编译型语言——源代码编译生成机器语言,然后由机器直接执行机器码即可执行。

2.Go语言发展(版本/特性)

2009年11月7日 weekly.2009-11-06 —— 早期的版本

2012年3月28日 go1 —— 稳定版版的发布

2013年5月14日 go1.1 —— 语言本身的变化、库的变化等。

2013年12月01日 go1.2 —— 提供更好的调度和一个新的语言特性。

2014年6月18日 go1.3 —— 主要是在实现的工作上的变化,以及精准的垃圾回收。

2014年12月10日 go1.4 —— 包含了2个很小的语言变更。

2015年8月19日 go1.5 —— 实现的架构变化,同时保留了和旧版本的兼容性。

2016年2月7日 go1.6 —— 语言本身、运行时、和库的实现的变化。

2016年8月15日 go1.7 —— 标准库有显着的性能改进和变化。

2017年2月26日 go1.8 —— 标准库有显着的性能改进和变化。

2017年8月24日 go1.9 —— 是包含语言,标准库,以及运行时的诸多变化。这个版本中的大部分工作都是对运行时和工具的改进。

2018年2月16日 go1.10 —— 大部分更改都在工具链,运行时和库的实现中。

2018年8月24日 go1.11 —— modules和WebAssembly支持。

2019年2月25日,GO语言Go1.12版发布

三、GO语言特点

1.GO的优势

1、Go 语言是一个开源项目

2、简化问题,易于学习

3、内存管理,简洁语法,易于使用

4、快速编译,高效开发

5、高效执行

6、并发支持,轻松驾驭

Go 语言最最吸引人的地方可能是其原生支持并发编程(语言层面原生支持和通过第三方库支持是有很大区别的)。Go 语言的对网络通信、并发和并行编程的支持度极高,从而可以更好地利用大量的分布式和多核的计算机。开发者可以通过 goroutine 这种轻量级线程的概念来实现这个目标,然后通过 channel 来实现各个 goroutine 之间的通信。他们实现了分段栈增长和 goroutine 在线程基础上多路复用技术的自动化。

7、静态类型

Go语言新颖的类型系统使程序结构变得灵活而模块化。

Go语言虽然是静态编译型语言,但是它却拥有脚本化的语法,它简洁、清晰而高效,并且支持多种编程范式(函数式和面向对象)。

8、标准类库,规范统一

9、易于部署

Go 代码编译成机器码非常迅速

10、文档全面

11、免费开源

一句话总结:它是一个快速的、静态类型的编译型语言,感觉却像动态类型的解释型语言。

2.GO特性的缺失

许多能够在大多数面向对象语言中使用的特性 Go 语言都没有支持,但其中的一部分可能会在未来被支持。

为了简化设计,不支持函数重载和操作符重载
为了避免在 C/C++ 开发中的一些 Bug 和混乱,不支持隐式转换
Go 语言通过另一种途径实现面向对象设计(第 10-11 章)来放弃类和类型的继承
尽管在接口的使用方面(第 11 章)可以实现类似变体类型的功能,但本身不支持变体类型
不支持动态加载代码
不支持动态链接库
不支持泛型
通过 recover 和 panic 来替代异常机制(第 13.2-3 节)
不支持断言
不支持静态变量

四、Go语言的应用场景

编程语言说到底只是一种工具,不选最好的,只选最合适的

Go语言适用的场景为:
	#1、服务器编程,以前你如果使用C或者C++做的那些事情,用Go来做很合适,例如处理日志、数据打包、虚拟机处理、文件系统等。

	#2、凭借其出色的并发能力,Go在分布式系统领域,如集群系统、游戏服务器、数据库代理器、中间件等场景同样极具威力

	#3、网络编程,这一块目前应用最广,包括Web应用、API应用、下载应用,而且Go内置的net/http包基本上把我们平常用到的网络功能都实现了。

	#4、数据库操作

	#5、开发云平台,目前国外很多云平台在采用Go开发

Go语言不适合的场景为:

	#1、强实时性软件:话音通信、无人驾驶、垃圾回收、自动内存分配等因素都让Go在实时性上力不从心

其他
	Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过了。Go 语言一个非常好的目标就是实现所谓的复杂事件处理(CEP),这项技术要求海量并行支持,高度的抽象化和高性能。当我们进入到物联网时代,CEP 必然会成为人们关注的焦点。但是 Go 语言同时也是一门可以用于实现一般目标的语言,例如对于文本的处理,前端展现,甚至像使用脚本一样使用它。值得注意的是,因为垃圾回收和自动内存分配的原因,Go 语言不适合用来开发对实时性要求很高的软件。越来越多的谷歌内部的大型分布式应用程序都开始使用 Go 语言来开发,例如谷歌地球的一部分代码就是由 Go 语言完成的。如果你想知道一些其它组织使用Go语言开发的实际应用项目,你可以到 使用 Go 的组织 页面进行查看。出于隐私保护的考虑,许多公司的项目都没有展示在这个页面。在 Chrome 浏览器中内置了一款 Go 语言的编译器用于本地客户端(NaCl),这很可能会被用于在 Chrome OS 中执行 Go 语言开发的应用程序。Go 语言可以在 Intel 或 ARM 处理器上运行,因此它也可以在安卓系统下运行,例如 Nexus 系列的产品。
	在 Google App Engine 中使用 Go 语言:2011 年 5 月 5 日,官方发布了用于开发运行在 Google App Engine 上的 Web 应用的 Go SDK,在此之前,开发者们只能选择使用 Python 或者 Java。这主要是 David Symonds 和 Nigel Tao 努力的成果。目前最新的稳定版是基于 Go 1.4 的 SDK 1.9.18,于 2015 年 2 月 18 日发布。

五、GO语言应用

#1.Google
这个不用多做介绍,作为开发Go语言的公司,当仁不让。Google基于Go有很多优秀的项目,比如:https://github.com/kubernetes/kubernetes ,大家也可以在Github上 https://github.com/google/ 查看更多Google的Go开源项目。

#2.Facebook
Facebook也在用,为此他们还专门在Github上建立了一个开源组织facebookgo,大家可以通过https://github.com/facebookgo访问查看facebook开源的项目,比如著名的是平滑升级的grace。

#3.腾讯
腾讯作为国内的大公司,还是敢于尝试的,尤其是Docker容器化这一块,他们在15年已经做了docker万台规模的实践,具体可以参考http://www.infoq.com/cn/articles/tencent-millions-scale-docker-application-practice 。

主要职责是:

负责腾讯游戏蓝鲸平台后台开发工作
负责容器相关的开发工作

和蓝鲸平台,容器开发有关。腾讯作为主要使用C/C++的公司,使用Go会方便很多,也有很多优势,不过日积月累的C/C++代码很难改造,也不敢动,所以新业务会在Go方面尝试。

#4.百度
目前所知的百度的使用是在运维这边,是百度运维的一个BFE项目,负责前端流量的接入。他们的负责人在2016年有分享,大家可以看下这个 http://www.infoq.com/cn/presentations/application-of-golang-in-baidu-frontend .
其次就是百度的消息系统,从其最近的Golang招聘介绍就可以看出来.
负责公司手百消息通讯系统服务器端开发及维护

#5.京东
京东云消息推送系统、云存储,以及京东商城等都有使用Go做开发。

#6.小米
小米对Golang的支持,莫过于运维监控系统的开源,也就是 http://open-falcon.com/ 。

此外,小米互娱、小米商城、小米视频、小米生态链等团队都在使用Golang。

#7.360
360对Golang的使用也不少,一个是开源的日志搜索系统Poseidon,托管在Github上,https://github.com/Qihoo360/poseidon.

还有360的推送团队也在使用,他们还写了篇博文在Golang的官方博客上 https://blog.golang.org/qihoo。

360直播在招聘Golang开发工程师。

美团、滴滴、新浪以及七牛等。一般的选择,都是选择用于自己公司合适的产品系统来做,比如消息推送的、监控的、容器的等,Golang特别适合做网络并发的服务,这是他的强项,所以也是被优先用于这些项目。

#8.应用领域
服务开发、并发、分布式、微服务等方向

六、GO语言项目

docker:基于lxc的一个虚拟打包工具,能够实现PAAS平台的组建。

kubernetes :Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡

区块链:BTCD 是用go语言实现的完整节点的比特币实现

nsq:bitly开源的消息队列系统,性能非常高,目前他们每天处理数十亿条的消息

packer:用来生成不同平台的镜像文件,例如VM、vbox、AWS等,作者是vagrant的作者

skynet:分布式调度框架

Doozer:分布式同步工具,类似ZooKeeper

Heka:mazila开源的日志处理系统

cbfs:couchbase开源的分布式文件系统

tsuru:开源的PAAS平台,和SAE实现的功能一模一样

groupcache:memcahe作者写的用于Google下载系统的缓存系统

god:类似redis的缓存系统,但是支持分布式和扩展性

gor:网络流量抓包和重放工具

七、GO语言架构

GOPATH的工作区包含bin,src,和pkg这三个:

src——源码(包含第三方的和自己项目的)

bin——编译生成的可执行程序

pkg——编译时生成的对象文件

九、GO语言的吉祥物

gopher是一种生活在加拿大的小动物,它的中文名叫做囊地鼠,是go语言的吉祥物,在会议、文档页面和博文中,大多会包含这个小吉祥物,下图是才华横溢的插画家 Renee French 设计的,她也是 Go 设计者之一 Rob Pike 的妻子,gopher最大的特点就是挖洞速度特别快,这也正好吻合Go语言追求更快的运行速度、开发速度、学习速度(develop)的思想。

posted @ 2021-07-15 18:39  年少纵马且长歌  阅读(178)  评论(0编辑  收藏  举报