从 Reddit 到 Red Hat,Go 语言负责 Web 上 的关键系统。 Go 也是新兴一代语言中值得关注的成员。
“一个好的科幻小说应该能够预测的不是汽车,而是交通拥堵。” - Frederik Pohl
Golang 关注的不仅仅是显而易见的东西,而是编程的次要影响。 哪里有交通拥堵,可以避免吗? Go 表明,在许多情况下,这个问题的答案是肯定的。
因此,学习 Go 是您作为程序员可以做的最好的投资之一。 这可能是您第一次接触编译型语言、简化的并发或静态类型。 这些都是很棒的概念,几乎可以使任何语言的任何项目受益。
历史悠久,但历史简短
在深入研究 Go 之前,让我们先简要介绍一下。 Go 的设计通常是优雅而实用的,但只有在一些历史背景下,它的一些功能才有意义。
这个历史始于 C。在很多方面,C 是编程语言的拉丁语。 它启发了 JavaScript、Ruby、Python、C++、C# 和 Java。 其中一些语言甚至是用 C 编写的。通过查看上述任何语言中的 if/else 和控制流语句,很容易发现 C 的影响。 C 最初是 Dennis Ritchie 创建的,用于构建 Unix。 从那里,C 进入了 Linux 的核心,在那里 C 一直是首选语言。
Go 是由来自 Unix 和 C 时代的 传奇人物创建的。 在 Google 工作期间,Robert Griesemer、Rob Pike 和 Ken Thompson 发现自己对 C 系列语言的常见缺陷感到沮丧。 正如 C++ 的创建者 Bjarne Stroustroup 所说:“C 让人很容易搬起石头砸自己的脚; C++ 让它更难,但当你这样做时,它会炸掉你的整条腿。”
Go 成为 Robert、Rob 和 Ken 的解决方案。
Go 从 C 继承了很多优点。 关键字和语法具有精明的相似之处,并且在两种语言中程序化方法都是最前沿的。 另一方面,手动内存管理和长时间的编译是 C 中值得注意的难题。 Go 通过提供垃圾回收、内存安全和快速编译时间来绕过这些问题。 对快速编译时间的关注直接导致了 Go 的另一个目标:生产力。
Java 是大型、面向企业的开发团队的首选语言。 Go 在这里从 Java 中汲取灵感,并且还旨在成为大型企业开发团队的坚实基础。 另一方面,冗长和面向对象编程 (OOP) 继承是 Java 中值得注意的缺点。 Go 通过支持简洁的语法和接口而不是笨拙的 OOP 继承模型来避免这些缺陷。
也可以找到与动态语言的相似之处。 Go 具有强大的惯用风格,如 Python 的 PEP 8。 Go 偏爱约定优于配置,如 Ruby。 Go 在语言核心中内置了简单而直接的并发性,如 Node.js 事件循环。 在每种情况下,Go 的实现方式都有所不同,但相似之处仍然存在。
所有这些都说明,Go 最初是一种解决 C 的一些长期存在缺陷的方法。 自那以后,它已发展成为一种出色的通用编程语言。
Hello world
现在我们有了背景知识,我们准备好学习 Go 了。 本指南假定您已经有一些编程背景。 如果这是您的第一次介绍,请在 CodeAcademy 或 Learn Code the Hard Way 上查看 Python。 它们是针对绝对初学者的一种更慢、更有条理的指南。
剩下的你们呢? 我假设你有一些背景知识。 跟着我,是时候写一些 Go 代码了。
步骤 1:访问 play.golang.org。 这是你看到的
步骤 2:点击 Run 按钮。
您刚刚用 Go 运行了一个简单的 Hello World 程序。 简单! 让我们来谈谈它,这样我们才能真正理解它。
第 1 行
package main
package main 行将启动我们的大多数 Go 程序。 这一行只是告诉 Go 编译器我们想直接运行代码。 当我们准备好编写我们自己的包时,我们将用我们的包的名称替换 main 关键字。 简单。
第 3 行
import (
"fmt"
)
当我们需要 Go 中的一个包时,我们会 import 它。 如果我们习惯了 Python、Ruby 或 Node.js,这可能看起来很奇怪。 Go 的标准库被分解成一堆较小的包。 我们可以在 Golang 网站上 找到完整的列表。
在这种情况下,我们导入的是 fmt 包,它是 format 的缩写。 Gopher(即 Go 社区称呼 Go 程序员的方式)将 fmt 发音为“fumpt”。 既然我们已经运行了一些 Go 代码,我们就是 gopher 了。 导入允许我们使用 fmt 包。 我们将在下一个代码块中执行此操作。
第 7 行
func main() {
fmt.Println("Hello, playground")
}
最后,我们在运行代码。 每个 Go 程序都有一个 function main() 代码块,它被称为入口点。 如果我们是 C 程序员,这看起来很熟悉,如果我们是 Python、Ruby、Node.js 或类似的开发人员,则有点奇怪。 在动态语言中,执行从文档的顶部开始,然后逐行下降。 在 Go 中,它从入口点开始。
如果我们仔细观察,我们可能还会猜测 func 关键字是定义函数的一种方式。 我们是正确的。 (Go,我们!)
在入口点内部,我们调用了我们之前导入的 fmt 库,然后使用熟悉的点语法来调用一个方法。 在这种情况下,该方法是 Println。 正如我们可能猜到的那样,它会打印我们的“Hello”消息。
风格说明
最后,一些风格说明。 使用 CamelCase 作为您的变量和方法名称。 也就是说,FooBar 或 fooBar 而不是 foo_bar。 Go 对打开的花括号也有自己的看法。 看看如果在 func main() 和第一个左花括号 { 之间插入一个新行会发生什么。 在新行上使用花括号运行代码应该会产生一个错误。
Go 中的间距也已标准化。 尝试删除 fmt.Println 之前的制表符缩进,然后单击 Format 按钮。 Go 的格式化工具应该始终通过替换制表符来修复缩进。
如果你和我一样,你可能会觉得使用全角制表符很奇怪。 这与我通常的编码风格大相径庭。 我编写的大部分 Ruby 和 JavaScript 代码都用两个空格代替制表符。 Go 在这里有自己的看法,但谢天谢地,我可以继续写我的两个空格制表符内心。 只要它留在我的本地机器上,Go 就不介意。 当我提交到 GitHub 或公开访问的 repo 时,我将首先 运行 go fmt 来修复间距。
一个更好的选择是安装一个 像 EditorConfig 这样的插件。 这将使我的 Go 代码看起来像 Go,而我的其他代码则采用我喜欢的任何样式。 此外,EditorConfig 支持每个项目的设置,这对于通常因项目而异的语言来说非常有用,因为它们不认可规范样式(如 Python 或 Go)。
基础知识
到目前为止,我们已经编写了一些 Go 代码,这很棒。 如果我们想让美好时光继续下去,我们需要在我们的 本地机器上安装 Go。
之后,就可以深入了解基础知识了。 我们仍然需要查看变量、控制结构(例如,if/else)、类型等等。 Go by Example 是这方面的一个很棒的资源。 官方的 Tour of Go 是一个不错的选择。
Go by Example 的 变量部分 是开始这段新学习之旅的好地方。 从变量一直到 结构体部分 是我们 Go 学习的下一阶段的一个不错的规模。
这里重要的是什么? 第一个结论是静态类型是多么的好。 在 Python、Ruby 和 JavaScript 中,大量的测试都致力于类型检查。 此函数的输入是否是我们想要的类型? 测试在不是的情况下 的行为。 这种测试通常最终会成为大量的代码。
相比之下,Golang通过静态类型来拯救我们。请看以下示例
var hi string = "Hello, playground"
揭示了部分原因。另一部分原因在定义函数时体现出来
func foo(bar string) {
fmt.Println(bar)
}
该函数明确说明了它将接受哪些类型。 尝试将 hi 从字符串更改为整数。 下次运行时,我们将收到一个方便的错误消息。
main.go:14: cannot use hi (type int) as type string in argument to foo
快速的前期定义可以为我们节省大量的错误、测试和麻烦。
其他值得注意的地方? 如果我们导入一个未使用的包或声明一个未使用的变量,Go 会报错。 这只是一个让我们保持诚实的好功能。 尝试声明一个变量,看看在没有相应的 Println 的情况下运行代码会发生什么。
最后,是指针。 如果它们是一个新概念,它们可能是一个很大的障碍。 指针也是 Go 最有价值的学习机会之一。 这里要注意的一点是 Go 按值传递。
按值传递意味着,在大多数情况下,Go 在对变量采取操作之前会创建该变量的副本。 我说的是大多数时候,因为我们可以使用指针来覆盖这种行为。 这就是指针的目的。 另外,学习所有这些也是轻松理解内存管理的好方法。
超越基础
我们甚至还没有开始介绍 Go 最好的部分! 我问了我在 CoreOS 的同事(我们在那里大量使用 Go)他们认为什么最重要。 我收到了各种各样的答案,我没有足够的字数在这里详细介绍。(如果你感兴趣,channels、goroutines、composition 和 type embedding 是众多建议中的几个。)
相反,我将用我最后的几句话来节省篇幅。 首先,通过Go by Example 和官方的 Tour of Go 继续学习。 如果你觉得自己渴望更深入的内容,Go in Action 是一本很棒的书。 避免使用 Go Programming Language (GoPL),因为它是一个详尽的参考。 这是一本很棒的书,但作为 Go 的新手,它可能会让你精疲力尽。
如果你想学会游泳,你需要跳入水中。 换句话说,通过阅读只能学习那么多——在某些时候你需要应用它。 Go 的 pkg 文档是找到可以修改的示例的好地方。 考虑一下来自 net/http docs 的这个 blob,它向你展示了如何设置一个简单的 Web 服务器。 其他很棒的资源包括 exercism.io 和 Project Euler。
最后,是社区! Go 有 Slack、IRC 和许多其他频道,我们可以在那里寻求帮助或分享笑声。 我强烈建议加入。
结束语
Go 是一门很棒的语言。 它在短时间内取得了巨大的发展,成为许多 著名项目的基石。
我希望你学习 Go 玩得开心。 并且,一定要 告诉我 情况如何!
6 条评论