【Go 语言入门专栏】Go 语言的起源与发展

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 安装与环境配置》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/587069.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

安居水站:古斯塔夫·勒庞:揭秘群体心理的力量

“群众从来不渴求真理。 他们回避那些让他们不高兴的事实,而更喜欢崇拜能够诱惑他们的错误。凡是懂得欺骗她的人,都容易成为她的主人,凡是试图开导她的人,永远都是她的牺牲品。”古斯塔夫勒邦-群体心理学/古斯塔夫勒邦&#xff08…

哈希(hash)函数

本文已收录至《全国计算机等级考试——信息 安全技术》专栏 哈希函数,也称为散列函数 或杂凑函数,指将哈希表中元素的关键键值映射为元素存储位置的函数。是一种将任意长度的数据映射到固定长度输出的函数。哈希函数的特点包括压缩性,即输入数…

袁庭新ES系列18节|Spring Data Elasticsearch高级

前言 这一章节袁老师将带领同学们来学习Spring Data Elasticsearch高级操作相关的内容。我们继续来探索SDE是如何将原始操作Elasticsearch的客户端API进行封装的,以及通过Spring Data Elasticsearch如何来操作ES。准备好了吗?我们继续来探索ES的内容。 …

Android Studio 调试:快速入门指南

作为一名Android应用开发人员,调试是你不可或缺的技能之一。通过调试,你可以定位和解决各种问题,包括崩溃、性能问题、UI错误等。在本文中,我们将分享一些实用的Android调试技巧,帮助你提高应用开发效率。 Android St…

餐后血糖波动?学会在米饭里加两物

米饭里加两物,帮你平稳餐后血糖,餐后血糖稳稳的,别让你碗里的米饭太单调,搭着吃对血糖好。今天呢我教大家一招,在蒸米饭的时候,加上两种食材,能够改善餐后血糖。 第一就是在煮米饭的时候加点糙米…

STM32 F103C8T6学习笔记17:类IIC通信—MLX90614红外非接触温度计

今日学习配置MLX90614红外非接触温度计 与 STM32 F103C8T6 单片机的通信 文章提供测试代码讲解、完整工程下载、测试效果图 本文需要用到的大概基础知识:1.3寸OLED配置通信显示、IIC通信、 定时器配置使用 这里就只贴出我的 OLED驱动方面的网址链接了&#xff1a…

【热闻速递】Google 裁撤 Python研发团队

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 【🔥热闻速递】Google 裁撤 Python研发团队引入研究结论 【&#x1f5…

配置及使用OpenCV(Python)

python配置OpenCV相对于c的配置方法容易的多,但建议在Anaconda中的Python虚拟环境中使用,这样更方便进行包管理和环境管理: 先激活Anaconda的python虚拟环境: conda activate GGBoy 随后下载 opencv 包: conda ins…

数据结构——树概念以及结构

首先我们来复习一下顺序表和链表的优缺点。 顺序表缺点: 1.中间或者头部插入、删除数据需要挪动覆盖,效率低 2.空间不够只能扩容,扩容有消耗 3.倍数扩容,空间用不完,存在浪费空间 顺序表优点: 1.可以…

低代码工业组态数字孪生平台

2024 两会热词「新质生产力」凭借其主要特征——高科技、高效能及高质量,引发各界关注。在探索构建新质生产力的重要议题中,数据要素被视为土地、劳动力、资本和技术之后的第五大生产要素。数据要素赋能新质生产力发展主要体现为:生产力由生产…

电商日志项目(一)

电商日志项目 一、项目体系架构设计1. 项目系统架构2. 项目数据流程二、环境搭建1. NginxLog文件服务1.1. 上传,解压1.2. 编译安装1.3. 启动验证2. Flume-ng2.1. 上传解压2.2. 修改配置文件2.3. 修改环境变量2.4. 验证3. Sqoop3.1. 上传解压3.2. 配置环境变量3.3. 修改配置文件…

【19】JAVASE-多线程专题【从零开始学JAVA】

Java零基础系列课程-JavaSE基础篇 Lecture:波哥 Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机,Java 仍是企业和开发人员的首选开发平台。…

[高质量]2024五一数学建模A题保奖思路+代码(后续会更新)

你的点赞收藏是我继续更新的最大动力,可点击文末卡片获取更多资料 你是否在寻找数学建模比赛的突破点? 作为经验丰富的数学建模团队,我们将为你带来2024 年华东杯(A题)的全面解析包。这个解决方案包不仅包括完整的代…

2024年十款开源测试开发工具推荐(自动化、性能、混沌测试、造数据、流量复制)

今天为大家奉献一篇测试开发工具集锦干货。在本篇文章中,将给大家推荐10款日常工作中经常用到的测试开发工具神器,涵盖了自动化测试、性能压测、流量复制、混沌测试、造数据等。 1、AutoMeter-API 自动化测试平台 AutoMeter 是一款针对分布式服务&…

DigitalOcean 托管 Kafka 新增横向扩展功能

自2023年9月推出以来,DigitalOcean托管的Kafka已经使初创公司、不断增长的数字业务以及独立软件供应商(ISV)能够改善实时数据处理和分析,从而做出更具洞察力的决策。在新的一年里,我们很高兴地宣布DigitalOcean托管Kafka的横向扩展功能&#…

写文献综述常用的几种深度神经网络模型!

写文献综述常用的几种深度神经网络模型 卷积神经网络(CNN) 解释说明:专门用于处理图像和图像数据的深度学习模型。它通过卷积层、池化层等操作提取图像特征。应用:图像分类、目标检测、人脸识别等。未来改进:进一步提…

数据结构篇2—《单链表(不带头单向不循环链表)》

文章目录 🚩前言1、单链表的内涵(1) 逻辑结构(2) 物理结构 2、链表的分类3、单链表的具体实现(1) 框架结构(2) SingleLinkList.h头文件的实现(3)SingleLinkList.c源文件的实现①SLTPushBack()尾插函数②SLTPushFront()头插函数③SLTPopBack()尾删函数④SLTPopFront(…

高效管理—影视管理系统_后台源码+APP源码+电影数据

高效管理—影视管理系统 产品概述产品展示演示地址产品功能产品优势产品服务源码领取下期更新预报 产品概述 本产品是一个功能强大且易于使用的影视资源管理工具,它提供了一个集中管理和组织电影、电视剧、纪录片等影视作品的平台,帮助用户高效地管理和…

easyExcel - 带图片导出

目录 前言一、情景介绍二、问题分析三、代码实现1. 单图片导出2. 多图片导出3. 多图片导出(优化) 前言 Java-easyExcel入门教程:https://blog.csdn.net/xhmico/article/details/134714025 之前有介绍过如何使用 easyExcel,以及写…

中间件之异步通讯组件RabbitMQ入门

一、概述 微服务一旦拆分,必然涉及到服务之间的相互调用,目前我们服务之间调用采用的都是基于OpenFeign的调用。这种调用中,调用者发起请求后需要等待服务提供者执行业务返回结果后,才能继续执行后面的业务。也就是说调用者在调用…