Go语言的起源与发展:从Google实验室到云计算基础设施
Go语言的起源与发展:从Google实验室到云计算基础设施
Go语言作为当下最流行的编程语言之一,凭借其简洁的语法、高效的并发处理能力和快速的编译速度,在云计算、大数据处理、网络编程等领域得到了广泛应用。本文将从Go语言的起源、发展、特性及其在各个领域的应用等多个维度,为您全面解析这门由Google开发的开源编程语言。
前言
Go语言是当下最为流行的编程语言之一,大约在2020、2021年左右开始于国内盛行,许多大厂很早就将部分Java项目迁移到了Go,足可看出其在性能方面的优越性。
相信各位都知道,在爬虫业务中,并发是一个关键的需求,不然仅靠单线程采集数据,只怕公司垮了数据都还没采完。以往编写爬虫脚本,通常会使用Python语言,不过,想用Python实现较好的并发性能,相对麻烦,并且容易受到服务器或电脑配置的影响。相较之下,Go语言天然的支持轻量级线程(goroutine)和通道(channel),这使得并发编程变得非常简单,也更为稳定。比之Python,Go还有很多优势,并且,时至今日,各开源社区的大佬们也贡献了许多优秀的Go语言爬虫库及框架,例如colly、goquery、requests-go等等,相关生态越来越好。
现在很多公司要求使用Go语言编写爬虫脚本,以往的Python程序也会逐步迁移。Boss直聘上,在一些公司爬虫岗的职位描述里,也要求能够熟练使用Go语言:
由此看来,Go语言正在逐步成为日常工具,被广泛运用于后端开发和爬虫中,所以学习Go语言是很有必要的,无论目前是否是刚需,都值得储备相关知识。
简介
Go语言(也称为Golang)是一种由Google开发的开源编程语言。
过去,许多开发者在使用C++来开发大型的服务端软件时,由于二进制文件一般都非常大,需要耗费大量的时间在编译文件上,同时编程语言的设计思想也已经非常陈旧,这些情况都充分表明了现有的编程语言已不符合时下的生产环境。
学者们坐下来总结出了现在生产环境与软件开发之间的主要矛盾,并尝试设计一门全新的编程语言来解决这些问题。他们讨论得出的对编程语言的设计要求:
- 能够以更快的速度开发软件
- 开发出的软件能够很好地在现代的多核计算机上工作
- 开发出的软件能够很好地在网络环境下工作
- 使人们能够享受软件开发的过程
Go语言就在这样的环境下诞生了,它的主要目标是“兼具Python等动态语言的开发速度和C/C++等编译型语言的性能与安全性”。
Go语言出现的目的是在编程领域中创造出最实用的方式来进行软件开发。它并不是要用奇怪的语法或晦涩难懂的概念来从根本上推翻已有的编程语言,而是重建并改善了C、C#、Java中的许多语法风格。
起源
Go语言的起源可以追溯到2007年。
在2007年的时候,谷歌开发工作的规模与正在部署的生产系统规模暴增,需要有个好的解决方案应对这些挑战。
当时Robert Griesemer、Rob Pike和Ken Thompson都是用的C++,编译一个分布式集群大概要花费45分钟,这个过程让三个人都很难以忍受。
2007年9月20日星期四下午,在等待编译的时候Rob Pike把Robert Griesemer和Ken Thompson喊到一起决定要做些什么:他们不想永远使用C++,并且想要很好处理并发的问题。希望创造一个能够摒弃其他语言的缺点的新语言,保持静态类型和运行时效率、具有可读性和可用性、具备高性能网络和并发处理。
Go这个名字是Rob Pike取的,认为它很短、易于输入,非常合适这一新语言的特性。
最初的一周内,他们就讨论出来了很多Go语言的风格和特性,并着手开发。
经过两年的努力,于2009年11月,Google宣布了Go语言的首个公开发布版本,即Go 1。
大佬三连坐:
顶级初创团队:
① Robert Griesemer,参与开发Java HotSpot虚拟机,并负责Chrome浏览器和Node.js使用的Google V8 JavaScript引擎的代码生成部分。
② Rob Pike,Go语言项目总负责人,贝尔实验室Unix团队成员,参与的项目包括Plan 9,Inferno操作系统和Limbo编程语言。
③ Ken Thompson,贝尔实验室Unix团队成员,C语言、Unix和Plan 9的创始人之一,与Rob Pike共同开发了UTF-8字符集规范。
随着更多有才华的程序员加入到Go开发团队中,更多贡献者开始为Go语言项目添砖加瓦。使得Go在发布的当年就成为了著名编程语言排行榜TIOBE的年度最佳编程语言。
Go发布后就吸引了一些公司,尤其是云计算领域的初创公司成为了Go语言的早期接纳者。在经过若干年的磨合后,在这些公司中诞生了不乏像Docker(容器引擎)、Kubernetes(云原生事实标准平台)、Ethereum(区块链公链以太坊)等“杀手级”或示范性项目,这些项目也让Go被誉为
云计算基础设施新兴语言
或直接称为
云计算语言
。
Go在近些年云原生领域的广泛应用也让其跻身云原生时代的头部编程语言。
Logo的诞生
在Go立项的时候,Rob Pike的妻子Renee French(著名美国插画师、漫画家和作家,以其独特的风格和奇特的创意而闻名)就帮他们画了一个标志,然后这个图标就出现在Google Code网站和第一件Go T恤上,该Logo被用来体现Go的速度:
2009年11月10日Go准备开源发布的之前,Rob Pike的妻子建议,将她在1999年左右为新泽西州WFMU广播电台年度筹款活动设计的,作为宣传的形象,改编成为Go的吉祥物------Gopher(地鼠):
发错了,是这个 ~(~ ̄▽ ̄)~:
之后,Rob Pike的妻子又绘制了更多的Go gopher形象,代表着Go项目和各地的Go程序员。这些可爱的形象成为Go世界中最受欢迎的事物之一,被世界各地的Go程序员广泛使用:
发展历程
初期版本(2009年-2012年):
初期版本的Go语言主要集中于提供简洁、高效的编程体验,以及强大的并发支持。这些特性使其成为了云服务、网络应用和大规模分布式系统开发的理想选择。
Go 1发布(2012年):
Go 1是Go语言的首个稳定版本,也是第一个被广泛用于生产环境的版本。发布Go 1的目标是提供稳定的API和ABI,以便未来版本的兼容性。
生态系统的发展(2012年-至今):
随着Go语言的发展,其生态系统也在不断壮大。包括标准库、第三方库、框架以及工具链在内的生态系统都得到了极大的丰富和改进,使得Go语言更加适用于各种类型的应用开发。
Go语言在工业界的应用(2010年至今):
自从Go语言发布以来,越来越多的公司和组织开始采用Go语言进行开发。一些知名的公司,如Google、Uber、Dropbox、Docker、Cloudflare、MongoDB等,都在生产环境中使用Go语言开发核心系统。
版本更新和改进(2012年至今):
Go语言的开发团队持续不断地发布新的版本,以改进语言的性能、稳定性和功能。Go社区也积极参与到语言的发展中,提出改进建议、修复bug,并贡献各种开源项目。
版本迭代
官方发布历史:https://go.dev/doc/devel/release
特性
① 简洁易学
Go语言的语法设计简洁明了,摒弃了一些繁琐的特性和语法元素,使得代码更易于阅读和维护。这使得Go语言成为一门学习曲线较为平缓的编程语言,即使是没有编程经验的人也能相对轻松地上手。
② 高并发性能
Go语言天生支持并发编程,通过goroutine和channel机制,使得并发编程变得非常简单。
传统编程语言(如C、C++等)的并发实现,实际上就是基于操作系统调度的,即程序负责创建线程(一般通过pthread等函数库调用实现),操作系统负责调度。这种传统支持并发的方式主要有两大不足:复杂与难于扩展。
为了解决这些问题,Go果断放弃了传统的基于操作系统线程的并发模型,而采用了
用户层轻量级线程
或者说是
类协程(coroutine)
,Go将之称为goroutine。
goroutine占用的资源非常少,Go语言运行时默认为每个goroutine分配的栈空间仅2KB,会自动在配置的一组逻辑处理器上调度执行goroutine。每个逻辑处理器绑定到一个操作系统线程上。这让用户的应用程序执行效率更高,而开发工作量显著减少。
goroutine调度的切换也不用陷入(trap)操作系统内核层完成,代价很低。因此,在一个Go程序中可以创建成千上万个并发的goroutine。所有的Go代码都在goroutine中执行,哪怕是Go的运行时代码也不例外。
而channel(通道)则提供了不同goroutine之间的通信和同步机制,使得编写并发代码变得直观而安全,可以帮助用户避免在其他语言里常见的共享内存访问的问题。
③ 快速编译
Go语言的编译速度非常快,这得益于其先进的编译器和优化器。快速的编译速度可以大大提高开发效率,特别是在大型项目中。
④ 内存管理
Go语言拥有自动内存管理功能,也就是垃圾回收机制。这意味着开发者不需要手动管理内存分配和回收,大大减轻了编程的负担,同时也有助于防止内存泄漏。
⑤ 静态类型语言
Go语言是一门静态类型的编程语言,这意味着在编译期间就能捕获到一些类型相关的错误。静态类型检查有助于提前发现潜在的Bug,减少在运行时可能出现的错误。
⑥ 跨平台支持
Go语言的编译器可以在多种平台上运行,可以轻松地将Go程序编译成适用于不同操作系统和硬件架构的可执行文件。这使得Go语言成为跨平台开发的理想选择。
⑦ 强调并遵循软件工程原则
Go语言鼓励开发者编写清晰、简洁、可维护的代码。它有一套明确的代码风格规范,并自带了一些工具来帮助开发者保持一致的代码风格。
⑧ 丰富的标准库
Go语言附带了丰富而强大的标准库,覆盖了网络、文件处理、加密、并发等方面。开发者可以直接使用标准库提供的功能,而无需引入大量的第三方库。
⑨ 工具链
完整的工具链对于日常开发极为重要。Go在此做得相当不错,无论是编译、格式化、错误检查、帮助文档,还是第三方包下载、更新都有对应的工具。其功能未必完善,但起码算得上简单易用。
内置完整测试框架,其中包括单元测试、性能测试、代码覆盖率、数据竞争,以及用来调优的pprof,这些都是保障代码能正确而稳定运行的必备利器。
除此之外,还可通过环境变量输出运行时监控信息,尤其是垃圾回收和并发调度跟踪,可进一步帮助我们改进算法,获得更佳的运行期表现。
⑩ 文档资源
Go语言拥有丰富的官方文档资源,包括语言规范、标准库文档、命令行工具说明等。此外,Go语言社区中也有许多优秀的教程、博客和论坛,为开发者提供了学习和交流的平台。
性能测评
以下是Go语言与其他编程语言的对比测试数据(源于网络资料):
- 在相同的环境和执行目标的情况下,Go程序比Java或Scala应用程序要快上2倍,并比这两门语言使用少占用70%的内存,执行效率大约比C++慢20%;
- Go的编译速度要比绝大多数语言都要快,比Java和C++快5至6倍,比Scala快10倍;
- Go语言通过垃圾回收器自动管理内存,这在某些情况下可能会引入一些运行时开销。相比之下,C/C++需要手动管理内存,这可能会导致内存泄漏和悬挂指针等问题;
- Go和Python在一般开发的平均水平测试中,Go要比Python 3快25倍左右,少占用三分之二的内存,但比Python大概多写一倍的代码,毫无疑问,开发效率上,Python是要技高一筹的;
- 比较Go和Python在简单的web服务器方面的性能,单位为传输量每秒:
原生的Go net/http包要比web.py快7至8倍,如果使用web.go框架则稍微差点,比web.py快6至7倍。如果是使用Python中的tornado异步服务器和框架开发出的Web应用,那么要比传统的web.py快很多,此时,Go大概只比它快1.2至1.5倍,Go在Web开发的领域比Python要快,但目前来看,并非碾压态势。
业务方向
网络编程:
Go语言原生支持高效的并发编程,因此非常适合用于构建网络应用程序和分布式系统。
大数据处理:
Go语言具有高效的执行性能和并发处理能力,因此很适合用于处理大量数据。
云原生开发:
随着云原生应用的兴起,Go语言也成为云原生开发的热门选择。Go的快速启动时间、小内存占用和高并发性能使其非常适合在云环境中构建轻量级容器化应用和无服务器函数。
微服务:
Go语言对于构建微服务和API很有优势,因为它的代码结构简单,易于维护,同时具有高效和高并发特性
数据库和存储系统:
Go语言提供了丰富的数据库和存储库,包括SQL数据库(如MySQL、PostgreSQL)、NoSQL数据库(如MongoDB、Redis)以及分布式存储系统(如etcd)。这使得Go成为开发高性能、可扩展和可靠的数据存储解决方案的理想语言。
Web开发:
Go语言拥有轻量级的HTTP服务器,使其成为构建高性能Web应用程序的理想选择。它支持快速开发和部署,并且具有良好的性能和可靠性。很多人使用Golang是因为它非常快,而且它可以用来并行运行进程,这样他们就不必互相等待。
它内置了对并发的支持,并促进了单个进程中线程和处理器之间的并行性。这可以使你的网站更容易快速加载并为你提供最佳的用户体验。
区块链开发:
Go语言在区块链开发领域也得到了广泛应用。许多知名的区块链项目(如Ethereum)使用Go语言作为其主要开发语言,因为Go具有高效的并发能力和良好的性能,适合处理区块链交易和智能合约。
来自Go语言之父的忠告
Rob Pike今年已经68岁了,大部分时候在澳大利亚生活,现在居住在悉尼新南威尔士州。
在最近的一次采访中,他总结了自己40多年开发经验说:
避免倦怠的最好方法是在支持你的环境中做你真正喜欢的事情
。他认为自己是幸运的,在贝尔实验室和谷歌都是如此。
同时他也提醒我们:
如果对工作感到压力,应该随时休息或者改变方向
。
参考资料推荐
- Go官方文档:https://go.dev/doc/
- Go技术论坛:https://learnku.com/docs/the-way-to-go
- Go语言简明教程:https://geektutu.com/post/quick-golang.html
- Go语言中文网:https://studygolang.com/
- C语言中文网:https://c.biancheng.net/golang/intro/
- 维基百科:https://en.wikipedia.org/wiki/Go_(programming_language)
- 菜鸟教程:https://www.runoob.com/go/go-tutorial.html