Go 语言入门

Go 语言是许多关键网络系统的基石,因此学习这门语言是程序员可以做的最佳投资之一。
921 位读者喜欢这篇文章。
Getting started with Go

Ashley McNamara 和 Mat Ryer。Go gopher,作者:Renee French。CC BY-3.0

从 Reddit 到 Red Hat,Go 语言负责关键系统 遍布网络。Go 语言也是新兴一代语言中的重要成员。

“好的科幻小说应该能够预测的不是汽车,而是交通堵塞。” —弗雷德里克·波尔

Golang 超越显而易见的事物,深入研究编程的次要影响。交通堵塞在哪里?可以避免吗?Go 语言表明,在许多情况下,这个问题的答案是肯定的。

因此,学习 Go 语言是您作为程序员可以做的最佳投资之一。它可能是您首次接触编译型语言、简化的并发或静态类型。这些都是极好的概念,几乎可以使任何语言的任何项目受益。

历史悠久,但历史短暂

在深入研究 Go 语言之前,让我们先稍微绕道而行。Go 语言的设计通常是优雅而实用的,但它的一些功能只有在一定的历史背景下才能理解。

这段历史始于 C 语言。在许多方面,C 语言都是编程语言中的拉丁语。它启发了 JavaScript、Ruby、Python、C++、C# 和 Java。其中一些语言甚至是用 C 语言编写的。通过查看上述任何语言中的 if/else 和控制流语句,很容易发现 C 语言的影响。C 语言最初是由 丹尼斯·里奇 创建的,用于构建 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 上的 Python 或 CodeAcademy笨办法学编程。它们是为绝对初学者提供的更慢、更系统的方法。

你们其他人呢?我假设你们已经有了一些背景知识。跟我来,是时候编写一些 Go 代码了。

步骤 1:访问 play.golang.org。您会看到以下内容

 

the_go_playground-hello-world.png

步骤 2:点击 运行 按钮。

您刚刚在 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 命名法。即 FooBarfooBar 而不是 foo_bar。Go 语言对左大括号的位置也很固执己见。看看如果在 func main() 和第一个左大括号 { 之间插入一个新行会发生什么。在新行上带有大括号的情况下运行代码应该会生成一个错误。

Go 语言中的空格也是标准化的。尝试删除 fmt.Println 之前的制表符缩进,然后单击 格式化 按钮。Go 语言的格式化工具应该始终通过替换制表符来修复缩进。

如果您像我一样,您可能会觉得使用全宽制表符很奇怪。这与我通常的编码风格大相径庭。我编写的大多数 Ruby 和 JavaScript 代码都用两个空格代替制表符。Go 语言在这方面很固执己见,但谢天谢地,我可以继续用我两个空格的制表符风格进行编码。只要它留在我的本地机器上,Go 语言就不会介意。当我提交到 GitHub 或公开访问的存储库时,我只需先 运行 go fmt 来修复空格。

一个更好的选择是安装像 EditorConfig 这样的插件。这将使我的 Go 代码看起来像 Go 代码,而我的其他代码则保持我喜欢的任何风格。作为奖励,EditorConfig 支持按项目设置,这对于通常因项目而异的语言来说非常棒,因为它们不认可规范的风格(如 Python 或 Go)。

基础知识

到目前为止,我们已经编写了一些 Go 代码,这很棒。如果我们想继续保持良好的势头,我们需要在我们的本地机器上安装 Go

在那之后,就该深入研究基础知识了。我们仍然需要研究变量、控制结构(例如 if/else)、类型等等。Go by Example 是一个极好的资源。Go 语言之旅 也是一个不错的替代方案。

Go by Example 的变量部分 是开始这段新的学习旅程的好地方。从变量到 结构体部分 是我们 Go 语言学习下一阶段的一个很好的规模。

这里重要的是什么?第一个收获是静态类型有多么好。在 Python、Ruby 和 JavaScript 中,大量的测试都致力于类型检查。此函数的输入是我们想要的类型吗?如果不是,则测试其行为。这种测试通常会变成大量的代码。

相比之下,Golang 通过静态类型为我们节省了麻烦。请看 以下示例

the_go_playground-static-types.png

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 语言)的同事,他们认为什么最重要。我收到了各种各样的答案,我没有足够的字符数在这里一一介绍。(如果您有兴趣,通道、goroutine、组合和类型嵌入是众多建议中的一部分。)

相反,我将用我最后的几句话来概括。首先,继续通过 Go by Example 和官方 Go 语言之旅 进行学习。如果您发现自己渴望更深入的内容,Go 语言实战 是一本很棒的书。避免 Go 程序设计语言 (GoPL),因为它是一本详尽的参考书。这是一本很棒的书,但作为 Go 语言的新手,它可能会让您精疲力尽。

如果您想学习游泳,您需要跳入水中。换句话说,一个人只能通过阅读学到这么多——在某个时候您需要应用它。Go 语言的 pkg 文档是查找示例进行尝试的好地方。考虑来自 net/http 文档 的这个 blob,它向您展示了如何设置一个简单的 Web 服务器。其他很棒的资源包括 exercism.ioProject Euler

最后,社区!Go 语言有 Slack、IRC 和许多其他频道,我们可以在那里寻求帮助或分享笑声。我强烈建议加入。

结束语

Go 语言是一门出色的语言。它在短时间内取得了巨大的发展,成为许多 著名项目 的基石。

我希望您在学习 Go 语言时玩得开心。并且,请务必 告诉我 进展如何!

User profile image.
Paul Burt 是 CoreOS 的社区经理。他正在为您的 /r/kubernetes 帖子点赞,并在 freeNode 上回答您的 #coreos 问题。Paul 擅长揭秘基础设施,并使复杂、棘手的主题变得平易近人。他喜欢自酿啤酒、阅读独立漫画以及在电脑不听话时对着它大喊大叫。

6 条评论

很棒的介绍!非常感谢分享。:)

几年前我在大学学了 2 年的 Java 编程,这是我听过的关于编码的最佳解释之一。干得好,Paul!

写得非常好!我随意地开始阅读,结果读完了整篇文章。非常感谢。

谢谢,感谢您的好评。希望您喜欢使用 Go 语言!

回复 ,作者:Faisal (未验证)

一篇写得非常好的文章。我一直在寻找一个起点来学习 GO 语言,这就是它!谢谢。

© . All rights reserved.