-
Notifications
You must be signed in to change notification settings - Fork 0
/
b.html
161 lines (99 loc) · 10.6 KB
/
b.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
<h1>
Go 的起源
比杰什·奥斯
极客文化
比杰什·奥斯
·
跟随
出版于
极客文化
·
阅读时间:9 分钟
·
2021 年 5 月 14 日
14
1
回顾 Go 编程语言的起源
该图片由Dr. Domas在Pixabay上发布
介绍
2020 年 11 月,编程语言 Go 迎来了 11 岁生日。尽管 Go 自诞生以来已经取得了长足的进步,但与同类语言相比,它在许多圈子中仍被视为新手。本文试图回顾和回忆 Go 的旅程是如何开始的,并快速浏览一下它的设计目标和一些特性。稍后,我们将在后续文章中深入探讨 Go。
目标听众
本文面向那些对 Go 编程语言还不太熟悉的人。如果你已经熟悉 Go,那么这可能是一次回忆之旅。:-)
起源故事
Go 的故事始于 2007 年下半年的 Google。Google 的三位先生——Robert Griesemer、Rob Pike 和 Ken Thompson——正在努力解决他们面临的一些工程挑战。由于 Google 的运营规模,它面临的工程挑战与许多其他组织不同。这三人选择使用哪种编程语言的标准主要围绕三个考虑因素:高效编译、高效执行和易于编程。
尽管他们评估了许多现有的语言,但他们找不到任何一种语言能够满足他们所有三个主要考虑因素。这一认识促使他们考虑创建一种新的编程语言。因此,开发 Go 的种子就此种下。
该设计始于 2007 年 9 月,是 Google 的一个 20% 项目。随着事情的进展,许多其他人也加入了进来。2008 年 1 月,初始编译器的工作开始了。该语言后来于 2009 年 11 月开源。又过了几年,Go 于 2012 年 3 月发布了第一个稳定版本。从此,Go 的故事开始了,并一直延续至今。
吉祥物
如今,没有吉祥物,编程语言还能存在吗?那会有点蹩脚,不是吗?不用担心,这也涵盖了。Go 也有一个吉祥物,称为 Gopher。有趣的是,吉祥物的初始版本是由Renee French在 Go 诞生之前很久创建的。吉祥物后来被改编为 Go 项目。有关 Go Gopher 演变的更多详细信息可以在此处找到。这本身就是一篇有趣的文章。
Go Gopher(图片来源:golang.org)
Go 还是 Golang?
您可能也听说过Go被称为Golang。要澄清的是,该语言的官方名称是Go(而不是Golang)。您可能想知道:如果是这样,为什么有时它被称为Golang?好吧,当需要为 Go 注册域名时,创建者在仅使用go 获得域名时遇到了挑战。因此,选择了golang.org ,这导致许多人也将该语言称为Golang 。
(在撰写本文初稿时,go dot org 正在短暂出售。什么样的报价才算值得?“七位数以下的价格”)。
设计目标
当 Go 处于设计阶段时,它的设计者心中就有几个目标。这些目标是根据他们试图实现的目标以及从评估的其他语言中发现的缺点中吸取的教训确定的。
简单
首先,目标是开发一种语法清晰、简洁的简单语言。将关键字保持在最低限度是实现这一目标的手段之一。为了降低复杂性,需要一种轻量级的类型系统,没有类型层次结构。故意不进行隐式转换。人们认为,接口和实现之间的严格分离将使事情变得更简单。组合优于继承是另一种偏好。
规模
支持大规模编程是主要目标之一。这包括两个方面:
系统规模 :必须有更大的并发支持,并且需要有高效的进程级通信机制以及编译速度。
工程规模: 目标是开发一种由大型团队编写和维护的大型代码库语言。
支持现代硬件
当时可用的许多语言(C/C++、Java、Python等)都是在现代硬件出现之前设计的。(在这种情况下,现代硬件是指多核 CPU、联网硬件和分布式系统。) Go 是专门为利用现代硬件而设计的。
编码效率
在编写代码时,编程的简易性是期望的方面之一;类似于 JavaScript 或 Python 等动态语言。但是,在效率方面,人们更倾向于使用类似于 C、C++ 或 Java 等静态类型编译语言的语言。
安全
类型安全:没有人喜欢在生产环境中运行时出现类型问题。因此,类型安全非常重要。
内存安全: 没有人喜欢内存问题。因此,以安全的方式处理内存的能力也很重要。
更好的运行时间
他们的目标是实现一个具有高效、无延迟垃圾收集的运行时环境。除此之外,他们还希望拥有内置字符串、映射和用于线程内通信的通信通道。
更好的包装模型
良好的包模型对于保持代码库的可维护性大有裨益。明确声明依赖关系是一个目标,这也有助于缩短构建时间。
Go 中有什么?
以上这些设计目标奠定了 Go 语言的特性,那么在他们着手构建这门语言之后,他们取得了什么成就呢?
总而言之,他们能够构建一种对人类来说简单、对机器来说高效的语言。让我们进一步探索一下。
人性化的角度
该语言的语法简洁明了,只有 25 个关键字。关键字越少,运行时的复杂性就越低。基本语法主要是 C 系列,在声明和包方面受到 Pascal、Modula 和 Oberon 的一些启发。静态链接二进制文件方法进一步降低了运行时复杂性。
内置并发结构允许程序员以更简单的方式编写多线程应用程序。Go 使用一种称为goroutines的不同方法(轻量级线程)来实现多线程。goroutines 之间的通信和同步通过称为通道的类型化线程安全机制来处理;对通用映射、数组和切片的内置支持也改善了编码体验。
机器角度
Go 程序被编译成机器代码。由于没有中间层(例如 VM),因此性能显著提高。作为一门垃圾收集语言,程序员无需担心内存管理。内存安全机制(例如 nil 引用、运行时边界检查和变量的默认初始化)在运行时很有帮助。接口用于实现组合。
全面的
这些选择的结果导致了像 C++ 或 Java 这样的静态类型和编译语言(没有任何 VM),它在许多方面感觉像 JavaScript 或 Python 一样轻量和动态。
Go 中没有什么?
这是否意味着 Go 拥有一切?当然不是。设计师对于不包括哪些内容做出了一些选择。
Go 没有子类,也不支持继承。它采用了一种不寻常的面向对象编程方法,允许任何类型(而不仅仅是类)使用方法。这是在没有任何基于类型的继承(如子类)的情况下实现的。
没有构造函数或析构函数。没有与错误处理相关的控制结构(类似于try-catch-finally范例)。它没有指针运算、注释或隐式数字转换。此外,还有一些缺失的功能。
嗯……这听起来不太令人放心,不是吗?让我们试着了解一下背后的原因。
为什么有些功能被忽略了?
在正常情况下,大多数语言都希望添加尽可能多的功能。但是,就 Go 而言,正如您在上面看到的,许多功能被省略了。这是故意的选择。这样做有很多原因。
明晰
其中一个主要方面是,清晰度被视为一项关键特性。阅读代码时,应该清楚程序将做什么。编写代码时,应该清楚如何让程序做你想做的事情。有时这意味着写得更清楚一点,而不是调用一个晦涩难懂的函数。
用更少的资源做更多的事情
功能越多并不一定意味着语言越好。对于 Go 来说,“少即是多”
(尽管现在泛型还不可用,但是有一个提案,即在以后的版本中引入泛型,该提案已被 Go 团队接受。有关更多详细信息,请参阅此处。)
Go 与其他语言的比较
当你想为你的下一个产品/项目选择一种编程语言时,与其他语言进行比较是必不可少的。让我们尝试一下吧。
请注意,这是一个非常高层次的比较。详细的比较需要一篇文章来描述。因此,在这里,我们将尝试讨论几个主要方面。
与 C/C++ 相比
与 C/C++ 相比,Go 具有显式依赖关系。不允许循环依赖。不需要头文件。文件一起编译为单个二进制文件。垃圾收集器管理内存清理活动。内存始终使用默认值(归零)初始化。虽然存在指针,但没有指针算法。Go 没有构造函数或析构函数。字符串、切片和映射是内置于语言的一部分。
与 Java 相比
对 Java 的常见抱怨之一就是它的冗长。与 Java 相比,Go 不那么冗长。没有类似于 JVM 的机制。由于 Go 从一开始就考虑了并发性,因此并发支持要好得多。Go 不使用线程,而是使用另一种称为goroutines的机制,可将其视为轻量级线程。goroutine 之间的通信通过通道处理。与 Java 不同,Go 使用指针。函数被视为类型,这允许像任何其他类型一样使用函数;Java 允许从方法返回单个结果;但是,Go 允许从一个函数返回多个值。(请注意,Go 同时具有函数和方法。Go 中与 Java 的方法等效的是 f unction。Go中的方法不同于函数。)
与 Python 相比
Go 是一种静态类型语言,而 Python 是动态类型语言。由于这种特性,Go 提供了类型安全性。它是编译型语言,而 Python 是解释型语言。出于同样的原因,Go 的速度要快得多。与 Python 不同,Go 内置了对并发的支持。
我们可以用 Go 构建什么?
我们可以在很多用例中使用 Go。
Go 的主要用途是开发云和网络服务。其中最著名的例子是Docker、Kubernetes、Istio和Prometheus。
Go 的另一个出色领域是DevOps和站点可靠性工程。用 Go 构建此类工具可以提供更好的性能。
许多著名的命令行界面 (CLI) 也是用 Go 编写的。两个例子是kubectl和GitHub CLI。
你也可以使用 Go 进行 Web 开发。它对 HTTP/2 等协议、MySQL 和 PostgreSQL 等数据库有很好的支持。(虽然你可以用 Go 开发 Web UI,但我个人不建议这样做。)
Go 现在处于什么位置?
Go 现在在业界表现如何?CNCF(云原生计算基金会)中超过 75% 的项目都是用 Go 编写的。TIOBE 曾两次将 Go 评为年度编程语言:2009 年和 2016 年。尽管 Go 最初是作为“系统”语言设计的,但现在它已经发展成为一种“通用”语言。
谁使用 Go
在为您的产品选择语言时,需要考虑的一个方面是行业广泛采用。就 Go 而言,它自诞生以来已经取得了长足的进步,并获得了良好的行业采用率。Go 用户的完整列表可在此处找到。
探索更多
如果您想了解更多,这里是一些有用的链接:
学习 Go
去旅游
去游乐场
实例探究
用例:云、CLI、Web 开发和DevOps/站点可靠性工程
</h1>