Go语言的发展和应用
说明
Golang基础 - Go语言的发展和应用
# 1、Go语言的发展历史
# 1.1 Go语言的发展
2007年提出要开发一个更简单的语言
2007年,Google的几位大牛正在用
C++
开发一些比较繁但是核心的工作,主要是分布式集群,几位大牛觉得很闹心;正好那时候C++
委员会来Google公司做技术演讲,说C++
将要添加35个新特性,本来就觉得C++
在开发的时候太繁琐了现在又要加新特性,那以后不是更繁琐了吗?于是Rob Pike
提议他们几个自己搞一个简单一点的语言吧。2007年9月25确定语言名字
于是在2007年9月25号,这门语言的名字就确定了,看下面的邮件截图:
这是一封由 Rob Pike 在 2007 年 9 月 25 号,星期二,下午 3:12 回复给 Robert Griesemer、Ken Thompson 的有关编程语言讨论主题的邮件,邮件正文大意为:在开车回家的路上我得到了些灵感。给这门编程语言取名为“go”,它很简短,易书写。工具类可以命名为:goc、 gol、goa。交互式的调试工具也可以直接命名为“go”。语言文件后缀名为 .go 等等
2007年9月21日,开始设计语言雏形
2009年10月30日,Rob Pike宣布了Go语言的存在
2009年11月10日,以完全开源的方式公布了Linux和Mac OSX上的版本,11月22日公布了Windows上的版本
2010年1月8日,Go语言当选2009年年度语言
2010年5月,谷歌将Go语言投入生产使用
2011年4月,谷歌开始抽调员工全职开发Go语言,并于5月份宣布Google APP Engine支持Go语言
2012 年3月,Go1.0版本发布,随着 Go 第一个版本发布的还有一份兼容性说明文档。该文档说明,Go 的未来版本会确保向后兼容性,不会破坏现有程序。此版本中已经包含 go tool pprof 命令,它是Google的pprof C++分析器 (opens new window)的一个变种;同时还包含 go vet 命令(之前的是 go tool vet),它可以报告程序包中可能存在的错误。
2013 年5月,Go1.1版本发布,这个版本的 Go 致力于增强语言特性(编译器、垃圾回收机制、映射、goroutine 调度器)与性能。下面是改进的图例:
2013 年 12 月,Go1.2版本发布,test 命令支持代码覆盖率报告,并提供新的 go tool cover 命令输出代码测试覆盖率的统计信息:
同时可以提供代码测试覆盖信息:
2014 年 6 月,Go1.3版本发布,堆栈管理在此版本中得到了重要改善。堆栈现在会分配连续的内存片段 (opens new window),并提高了分配效率。这使得 Go 语言在下个版本中将堆栈大小减少到 2KB。
这同时改进了某些组件中堆栈的错误拆分所导致的性能下降问题,此类问题会在堆栈密集分配/释放状态下出现。以下 json 包的例子展示了性能对于堆栈大小的相关度:
2015年8月19日 ,Go1.5版本发布,本次更新中移除了“最后残余的C代码”,请内存管理方面权威专家Rick Hudson对GC进行重新设计(重要的修正)。从该版本开始,Go的发布时间延迟 (opens new window)了两个月,调整为每年 8 月和 2 月发布新版本:
2016 年 2 月,Go1.6版本发布,在使用 HTTPS 的情况下增加对于 HTTP/2 协议的默认支持是这次更新的最重要更改。同时,再一次降低了垃圾回收器的延迟:
2016 年 8 月,此版本发布了context包 (opens new window),它可以为用户提供处理超时和任务取消的机制。编译工具链在这次更新中得到了优化:加速了编译过程;降低了编译后二进制文件的大小,幅度可达 20~30%。
2017年2月16日 , Go1.8版本发布,此版本包含对于垃圾回收器的改进,使得两次垃圾回收的暂停时间减小到了毫秒级:
2017年8月24日 , Go1.9版本发布,此版本中增加了类型别名:
type byte = uint8
,这表示 byte 是 uint8 的类型别名。sync 包增加了保证并发访问安全性的Map (opens new window)类型。2018年2月16日 , Go1.10版本发布,test 包增加了新的智能缓存机制。现在成功完成的测试结果会被缓存,这样 test 包会自动跳过未做更改的代码的相关测试用例,节省了开发人员运行测试套件的时间:
first run: ok /go/src/retro 0.027s second run: ok /go/src/retro (cached)
1
2
3
4
5
6与此同时,go build 命令会缓存最近构建过的包,从而加快了构建过程。新版本不包含垃圾回收器的实质性改动,但为它重新定义了 SLO(服务级别目标):
2018年8月24日 , Go1.11版本发布,次版本引入了一个重要功能:Go模块 (opens new window)。Go 模块产生是为了应对 Go 语言社区面临的一大挑战。这是通过调查问卷收集到的:
第二个新特性是增加了实验性的WebAssembly (opens new window)支持,它可以帮助开发人员将 Go 程序编译为兼容四个主要 Web 浏览器的二进制程序。
2019年2月25日 , Go1.12版本发布,此版本在analysis (opens new window)包的基础上重写了 go vet 命令。这个包有着更大的灵活性,允许开发人员编写自己的代码检查工具。
2019年9月03日 , Go1.13版本发布,sync 包的 Pool 组件得到了改进,使得池中的资源不会在垃圾回收的时候被清除。通过新机制里引入的缓存,两次垃圾回收之间没有被使用过的实例才会被清除。同时重写了逃逸分析逻辑,使得 Go 程序减少了堆上的分配次数。以下是新的逃逸分析基准测试结果:
2020年2月25日 , Go1.14版本发布
2020年8月11日 , Go1.15版本发布
2021年2月16日 , Go1.16版本发布
Go语言发展趋势:
从世界范围来看,Co语言在中国大发展势头最猛,且远超第二名。国内大厂几乎都已经将Go语言用于生产环境的开发。很多小厂也选择Go语言实现弯道超车。
参考:https://medium.com/a-journey-with-go/go-retrospective-b9723352e9b0
# 1.2 Go语言的创始人
# 1.2.1 Ken Thompsom
- 1996年:加入贝尔实验室,在参与Multics(多路信息计算)开发期间,创造了
B语言
,并用一个月的时间用B语言开发了全新的 操作系统UNICS
,后来改名为我们所熟悉的UNIX
操作系统。 - 1971年:和丹尼斯·利奇(Dennis Ritchie)一起共同发明了C语言。
- 1973年:和丹尼斯·利奇(Dennis Ritchie)使用C语言重写了
UNIX
,并安装于PDP-11
的机器之上。 - 1983年:美国计算机协会将图灵奖授予汤普森。
- 2000年:加入Google工作。
- 2007年:64岁高龄,与Rob Pike和Robert Griesemer主导了Go语言的开发。
# 1.2.2 Rob Pike
- Go语言项目总负责人
- 贝尔实验室Unix团队成员,参与的项目包括
Plan 9
,Inferno
操作吸引和Limbo
编程语言 UTF-8
字符集规范唯二的发明人之一(另一位是Ken Thompson)- 《UNIX环境编程》和《程序设计实践》这两本书的作者之一
- 第22届莫斯科夏季奥运会射箭项目的银牌得主
- 业余文学家,设计的伽马射线望远镜差点被NASA用在航天飞机上
- 他的媳妇Renee French就是Go语言吉祥物的设计者
# 1.2.3 Robert Griesemer
- 参与V8 JavaScript引擎的开发
- 参与Java HostSpot虚拟机的研发
# 2、Go语言的优劣
# 2.1 Go语言的优势
- 语法简单,易于学习。类C的语法,同时比C/C++简洁和干净
- 自带GC,方便使用
- 快速编译,高效执行
- 简单的依赖管理
- 并发编程,轻松驾驭
- 静态类型,同时有一些动态语言的特征(var声明)
- 标准类库,规范统一
# 2.2 劣势
- 不支持泛型(1.17版本中已经支持泛型了,但是默认不支持,需要手动开启)
- 不支持动态加载代码
- 发展时间短,生态不及Java、C++庞大(并不代表Go的第三方库少)
# 3、Go语言的应用场景
- 巨型中央服务器领域
- 高性能分布式领域
- 游戏服务端开发
- 复杂时间处理
- 对实时性要求很高的软件开发
- 可以在Intel和ARM处理器上运行,因此也可以在安卓上运行
# 3.1 Go微服务开发
- 零依赖,让我们可以最小化我们的镜像,节省存储与拉取镜像带宽
- 对比Java的JVM,Runtime使用更小的内存
- 更好的并发能力,当你真的需求更多CPU的时候
- 更高的性能,对比解释型语言,在处理数据已经并发方面优势明显
- 简单,学习成本低,内部人员可以转入Go阵营
- 使用Go能更接近云原神生态,比如Docker、Kubernetes、Harbor都是使用Go语言开发的
# 3.2 基于Go语言的应用
- Docker
- Kubernetes
- Prometheus
- BEEGO
- Etcd
- Grafana