掘金 后端 ( ) • 2024-04-30 14:30

00

前言

Go 语言是当下最为流行的编程语言之一,大约在 2020、2021 年左右开始于国内盛行,许多大厂很早就将部分 Java 项目迁移到了 Go,足可看出其在性能方面的优越性。

相信各位都知道,在爬虫业务中,并发是一个关键的需求,不然仅靠单线程采集数据,只怕公司垮了数据都还没采完。以往编写爬虫脚本,通常会使用 Python 语言,不过,想用 Python 实现较好的并发性能,相对麻烦,并且容易受到服务器或电脑配置的影响。相较之下,Go 语言天然的支持轻量级线程(goroutine)和通道(channel),这使得并发编程变得非常简单,也更为稳定。比之 Python,Go 还有很多优势,并且,时至今日,各开源社区的大佬们也贡献了许多优秀的 Go 语言爬虫库及框架,例如 colly、goquery、requests-go 等等,相关生态越来越好。

现在很多公司要求使用 Go 语言编写爬虫脚本,以往的 Python 程序也会逐步迁移。Boss 直聘上,在一些公司爬虫岗的职位描述里,也要求能够熟练使用 Go 语言:

01

由此看来,Go 语言正在逐步成为日常工具,被广泛运用于后端开发和爬虫中,所以学习 Go 语言是很有必要的,无论目前是否是刚需,都值得储备相关知识。

为此,K哥新开《Go 语言入门专栏》,提供给大伙一个新的学习途径。

简介

Go 语言(也称为 Golang)是一种由 Google 开发的开源编程语言。

过去,许多开发者在使用 C++ 来开发大型的服务端软件时,由于二进制文件一般都非常大,需要耗费大量的时间在编译文件上,同时编程语言的设计思想也已经非常陈旧,这些情况都充分表明了现有的编程语言已不符合时下的生产环境。

学者们坐下来总结出了现在生产环境与软件开发之间的主要矛盾,并尝试设计一门全新的编程语言来解决这些问题。他们讨论得出的对编程语言的设计要求:

  • 能够以更快的速度开发软件
  • 开发出的软件能够很好地在现代的多核计算机上工作
  • 开发出的软件能够很好地在网络环境下工作
  • 使人们能够享受软件开发的过程

Go 语言就在这样的环境下诞生了,它的主要目标是“兼具 Python 等动态语言的开发速度和 C/C++ 等编译型语言的性能与安全性”。

Go 语言出现的目的是在编程领域中创造出最实用的方式来进行软件开发。它并不是要用奇怪的语法或晦涩难懂的概念来从根本上推翻已有的编程语言,而是重建并改善了 C、C#、Java 中的许多语法风格。

起源

Go 语言的起源可以追溯到 2007 年。

在 2007 年的时候,谷歌开发工作的规模与正在部署的生产系统规模暴增,需要有个好的解决方案应对这些挑战。

当时 Robert Griesemer、Rob Pike 和 Ken Thompson 都是用的 C++,编译一个分布式集群大概要花费 45 分钟,这个过程让三个人都很难以忍受。

XKCD 中的一幅漫画

2007 年 9 月 20 日星期四下午,在等待编译的时候 Rob Pike 把 Robert Griesemer 和 Ken Thompson 喊到一起决定要做些什么:他们不想永远使用 C++,并且想要很好处理并发的问题。希望创造一个能够摒弃其他语言的缺点的新语言,保持静态类型和运行时效率、具有可读性和可用性、具备高性能网络和并发处理。

Go 这个名字是 Rob Pike 取的,认为它很短、易于输入,非常合适这一新语言的特性。

最初的一周内,他们就讨论出来了很多 Go 语言的风格和特性,并着手开发。

经过两年的努力,于 2009 年 11 月,Google 宣布了 Go 语言的首个公开发布版本,即 Go 1。

大佬三连坐:

Robert Griesemer、Rob Pike 、Ken Thompson(2012年,Google I/O大会)

顶级初创团队:

① 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 的速度:

04

2009 年 11 月 10 日 Go 准备开源发布的之前,Rob Pike 的妻子建议,将她在 1999 年左右为新泽西州 WFMU 广播电台年度筹款活动设计的,作为宣传的形象,改编成为 Go 的吉祥物 ------ Gopher(地鼠):

big gopher

发错了,是这个 ~(~ ̄▽ ̄)~:

06

之后,Rob Pike 的妻子又绘制了更多的 Go gopher 形象,代表着 Go 项目和各地的 Go 程序员。这些可爱的形象成为 Go 世界中最受欢迎的事物之一,被世界各地的 Go 程序员广泛使用:

Go Gopher

发展历程

  1. 初期版本(2009 年 - 2012 年):

    初期版本的 Go 语言主要集中于提供简洁、高效的编程体验,以及强大的并发支持。这些特性使其成为了云服务、网络应用和大规模分布式系统开发的理想选择。

  2. Go 1 发布(2012 年):

    Go 1 是 Go 语言的首个稳定版本,也是第一个被广泛用于生产环境的版本。发布 Go 1 的目标是提供稳定的 API 和 ABI,以便未来版本的兼容性。

  3. 生态系统的发展(2012 年 - 至今):

    随着 Go 语言的发展,其生态系统也在不断壮大。包括标准库、第三方库、框架以及工具链在内的生态系统都得到了极大的丰富和改进,使得 Go 语言更加适用于各种类型的应用开发。

  4. Go 语言在工业界的应用(2010 年至今):

    自从 Go 语言发布以来,越来越多的公司和组织开始采用 Go 语言进行开发。一些知名的公司,如 Google、Uber、Dropbox、Docker、Cloudflare、MongoDB 等,都在生产环境中使用 Go 语言开发核心系统。

  5. 版本更新和改进(2012 年至今):

    Go 语言的开发团队持续不断地发布新的版本,以改进语言的性能、稳定性和功能。Go 社区也积极参与到语言的发展中,提出改进建议、修复 bug,并贡献各种开源项目。

TIOBE 指数中的 Go 语言发展曲线

版本迭代

04

官方发布历史: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 语言社区中也有许多优秀的教程、博客和论坛,为开发者提供了学习和交流的平台。

Less is exponentially more

性能测评

以下是 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 要快,但目前来看,并非碾压态势。

07

业务方向

  1. 网络编程:

    Go 语言原生支持高效的并发编程,因此非常适合用于构建网络应用程序和分布式系统。

  2. 大数据处理:

    Go 语言具有高效的执行性能和并发处理能力,因此很适合用于处理大量数据。

  3. 云原生开发:

    随着云原生应用的兴起,Go 语言也成为云原生开发的热门选择。Go 的快速启动时间、小内存占用和高并发性能使其非常适合在云环境中构建轻量级容器化应用和无服务器函数。

  4. 微服务:

    Go 语言对于构建微服务和 API 很有优势,因为它的代码结构简单,易于维护,同时具有高效和高并发特性

  5. 数据库和存储系统:

    Go 语言提供了丰富的数据库和存储库,包括 SQL 数据库(如 MySQL、PostgreSQL)、NoSQL 数据库(如 MongoDB、Redis)以及分布式存储系统(如 etcd)。这使得 Go 成为开发高性能、可扩展和可靠的数据存储解决方案的理想语言。

  6. Web 开发:

    Go 语言拥有轻量级的 HTTP 服务器,使其成为构建高性能 Web 应用程序的理想选择。它支持快速开发和部署,并且具有良好的性能和可靠性。很多人使用 Golang 是因为它非常快,而且它可以用来并行运行进程,这样他们就不必互相等待。

    它内置了对并发的支持,并促进了单个进程中线程和处理器之间的并行性。这可以使你的网站更容易快速加载并为你提供最佳的用户体验。

  7. 区块链开发:

    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

下期预告:《【Go 语言入门专栏】Go 安装与环境配置》