Go编程语言的介绍以及为什么要学习它
自2009年首次发布以来,Go(也被称为Golang)的受欢迎程度不断提高,并被大公司和小公司采用,大多是为了取代Python、Ruby和Node.js等动态环境。该语言有很多优点,在2020年及以后非常值得学习。
Go是一种命令式、静态类型的编译编程语言,由Rob Pike、Robert Griesemer和Ken Thompson于2007年在谷歌开发,并于2009年开放源代码。它的开发是对现有语言和环境的缺点的反应,这些缺点使得开发大型软件系统变得缓慢和笨拙。
在Go设计之初,Java和C++是Google编写服务器时最常用的语言,这些语言没有得到适当的发展以充分利用现代硬件的进步。
缓慢的构建时间、不受控制的依赖关系、糟糕的文档以及无法有效利用硬件资源是当时与这些语言相关的一些其他问题。另一个主要问题是越来越复杂,使得用这些语言开发的系统的维护变得乏味和低效。
由于这些问题,一些人开始在他们的服务器端项目中采用Ruby和Python等动态语言。这些语言不需要编译时间,这对生产力来说是个福音,但它们缺乏静态类型语言的性能特征和类型安全,经常造成难以追踪的错误。
Go的设计是为了提供两个世界中最好的东西:一种静态类型、快速编译和快速执行的语言,即使在真正的大型软件项目的规模下,仍然易于推理。
Go的用途
Go的作者最初设想将其作为C++等语言的替代品,但多年来它的应用情况并非如此。Go主要用于公司通常会选择Python、Node.js或Java的地方。特别是,Go很适合。
- 云和网络服务
- 网络开发
- 命令行工具
- DevOps和自动化工具
为什么要学习Go?
如前所述,Go提供了许多用动态语言编程的好处,而没有任何缺点。它的设计是简单的,容易推理的,所以它省略了很多其他主流语言中存在的疯狂的编程语法和功能。这使得它比较容易学习和教别人。
它还具有快速的编译时间和卓越的性能,尽管它通常比C++或Rust慢,但它的性能超过了Python或Ruby等动态语言。但话说回来,Go的设计并不是为了像这两种语言一样 "低"。
Go的 "包含电池 "标准库经常被称赞为其最好的功能之一。它内容广泛、跨平台、文档齐全,提供了构建网络服务或CLI工具所需的一切,而无需拉入任何第三方软件包。常见的用例,如字符串操作、文件和网络I/O、测试、模板化、JSON等,都被标准库很好地满足了。
该语言也非常稳定,有严格的兼容性承诺,保证任何Go 1.x的程序都能在后来的1.x版本的语言上运行而不改变。例如,在Go 1.13下运行的程序应该与Go 1.14、Go 1.15等版本兼容,无需修改。
部署Go程序是小菜一碟,因为你不需要安装运行时或经历任何复杂的步骤。go build 命令将把你的程序编译成一个二进制文件,你可以把它部署到你想要的平台上。你甚至可以通过定制一些环境变量来构建针对你自己的操作系统和架构以外的Go二进制文件。
随着越来越多的公司在其云服务和工具中采用Go语言,对Go开发者的需求也在上升。例如,Hired发现Go是他们平台上2019年最需要的语言。Go开发人员的工资也很高,根据StackOverflow的2020年调查,在美国仅次于Scala。

并发是Go的另一个强项。它提供了轻量级但强大的并发功能(goroutines和channel),确保你的软件能够有效利用它所运行的硬件资源。Go还有一个针对低延迟而优化的垃圾收集器,因此你不必管理自己的内存。
安装Go
如果你只是想在不投入的情况下玩玩Go,你可以使用Go的操场来感受其语法,并编写简单的程序。然而,如果你是认真学习Go的,你需要先在你的电脑上安装它。
Go团队为Window、macOS和Linux提供了预建的二进制文件。如果您使用的操作系统与上述三者不同,也可以选择从源代码安装。
Linux系统
你有几个选项可以在Linux机器上安装Go。如果你的电脑上已经安装了Snaps,你可以通过运行下面的命令获得最新版本的Go。
$ sudo snap install go --classic
否则,你可以检查你喜欢的发行版是否在其仓库中打包了Go。例如,Arch用户可以使用下面的命令来安装Go。
$ sudo pacman -S go
上述方法的主要注意事项是,你不一定能得到最新的版本,特别是当你的发行版不遵循滚动发布时间表时。
获得Go最新版本的保证方法是下载Linux的Go发行档案,并将其解压到/usr/local/ 目录中。
$ sudo tar -C /usr/local -xzf go$VERSION.$OS-$ARCH.tar.gz
确保在使用这种方法安装Go后,将/usr/local/go/bin 加入你的PATH 。你可以通过在你的~/.profile 或~/.bash_profile 文件中加入下面这行来完成。
~/.profile
export PATH=$PATH:/usr/local/go/bin
你可能需要运行source ~/.profile 或source ~/.bash_profile ,在go 命令可以使用之前立即应用你的改变。
macOS
在 macOS 上安装 Go 的最简单方法是使用 Homebrew。
$ brew install go
窗口系统
下载MSI安装程序,打开它并按照屏幕上的指示在你的机器上安装Go。默认情况下,Go工具将被安装在C:\Go 。
测试你的安装
要检查您是否正确安装了 Go,请打开终端并输入以下命令。
$ go version
它应该输出你所安装的Go的版本以及你的系统架构。例如,这是它在我的机器上打印的输出。
输出样本
go version go1.14.1 linux/amd64
如果你没有看到这些信息,而且你是在Windows上,请检查Go是否在你的PATH 系统变量中。一定要确保在继续进行之前对你的安装进行故障排除,并使其正常工作。
基本的编辑器设置
Go程序是以简单的UTF-8文本文件编写的,扩展名是.go ,所以你可以使用任何代码编辑器来进行Go编程。然而,我推荐使用VSCode,因为它在vscode-go插件的帮助下对围棋有强大的支持。
一旦你安装了这个插件,它就会为你提供格式化和智能代码完成。请确保将格式化打开,并尊重它默认使用的格式化规则,即使你有自己的偏好。
其原因是,格式化所有Go代码的惯用方法是使用gofmt工具,而vscode-go插件默认使用该工具。在 Go 社区中,偏离gofmt 所使用的规则是不可取的。
编写您的第一个 Go 程序
现在您已经安装了 Go 并设置了您的编辑器,您可以开始编写您的第一个 Go 程序。传统上,在学习一种新的语言时,你写的第一个程序是在屏幕上打印文本 "Hello, world!",所以我们在这里也会这样做。
为你的代码创建一个项目目录
第一步是创建一个新的目录来存储你的Go代码。在过去,必须在你的GOPATH 内创建你的Go项目,这是一个环境变量,它决定了Go应该在哪里读取和下载它将用于编译项目的所有源文件。GOPATH 在Unix系统中被假定为$HOME/go ,在Windows中被假定为%USERPROFILE%\go ,尽管你可以把它改为其他目录。
从Go v1.11开始,由于引入了Go模块,这不再是必要的,我们很快就会讨论。现在你可以在文件系统的任何地方创建你的Go项目,这对Go编译器来说并不重要。
你可以为你的项目创建一个目录,并使用下面的命令进入该目录。
$ mkdir hello-world
$ cd hello-world
编写并运行一个Go程序
在你的项目目录下创建一个新的main.go 文件,并在你的文本编辑器中打开它。在文件中输入以下代码并保存。
main.go
package main
import "fmt"
func main() {
fmt.Println("Hello, world!")
}
到你的终端窗口,输入以下命令来编译程序。
$ go build main.go
这将在你的项目目录中产生一个main 二进制文件。要运行该程序,在终端输入./main 。它应该将文本Hello, world! 打印到你的屏幕上。如果它做到了,恭喜你!你现在已经正式成为Go的一部分。你现在已经正式成为Go社区的一员了。

回顾Hello World程序
让我们详细回顾一下上述程序,以便你能更好地理解它。这里是第一行。
package main
每个Go源文件都属于一个包。一个包只不过是一个包含一个或多个源文件或其他Go包的目录。为了声明一个文件是包的一部分,我们使用package <packagename> 语法,它必须是文件的第一行。
main 包在 Go 中是很特别的。它表示程序应该产生一个可执行的二进制文件,同时也是每个可执行的Go程序的入口点。
在main包内,必须声明一个特殊的main 函数,它不需要参数,也不返回任何值。当程序运行时,这个函数将被自动调用。
func main() {
}
上面的代码在Go中定义了一个函数。func 关键字被用来创建一个新的函数,其名称(本例为main )和括号内的任何参数。函数主体也被包裹在大括号中{} 。Go要求开头的大括号必须与函数声明在同一行,否则代码将无法编译。
在main 函数内部,我们有以下代码。
fmt.Println("Hello World!")
fmt 包来自 Go 的标准库,它输出了几个与格式化和打印输出或从各种来源读取输入有关的方法。例如,Println 方法将提供的字符串输出到屏幕上,并在结尾处添加一个换行。
标准库包在你安装Go之后就可以使用。它们包含在你的安装中,所以你不需要在之后下载任何其他东西
在我们使用fmt 包中的方法之前,我们需要把它带入范围。这就是下面这句话的意思。
import "fmt"
编译和运行Go程序
与JavaScript或Python等动态语言不同,Go程序必须先编译成二进制文件才能执行。编译Go程序的方法是使用go build 命令,并将源文件或导入路径传给它。
$ go build main.go
如果编译成功,该命令将不会在屏幕上发出任何输出。但你会发现,在你的项目目录中产生了一个二进制可执行文件(main)。这就是你需要执行的,以运行程序。
$ ./main
还有一种方法可以用一个命令来编译和运行Go程序。
$ go run main.go
这将编译程序并立即运行,而不会在你的项目目录中产生二进制文件。请注意,go run ,实际上只适用于小程序,一般只需要一个文件。对于非小型程序,使用go build && ./<executable> 是构建和运行Go程序的推荐方式。

关于Go模块的简短介绍
模块是相关Go包的集合,作为一个实体一起发布。通常情况下,每个Go项目由一个单一的模块组成,该模块位于项目文件夹的根部,由一个go.mod 文件定义。这个文件定义了项目的模块路径,以及构建项目所需的任何依赖关系。
要创建一个新的模块,在项目的根部使用go mod init 命令。你需要传递项目的导入路径(通常是你的项目资源库的URL,不含方案)。即使你不打算发布你的代码,把它组织起来,就像你将来会这样做一样,这仍然是一个好习惯。
$ go mod init github.com/ayoisaiah/hello-world

如果你构建并运行你的项目,它应该和以前一样工作。不同的是,现在可以在你的项目中包括第三方的依赖,因为Go现在知道如何跟踪你的模块所使用的依赖版本。如果没有初始化go.mod 文件,任何试图建立有第三方依赖关系的项目都会出错而失败。
我们将在随后的教程中继续探索Go模块的一些其他功能。不过,如果你想深入了解,可以看看Go官方博客上关于这个主题的系列文章。
总结
在这篇文章中,我们讨论了为什么要开发Go,它解决了哪些问题。我们还考虑了该语言的一些常见用途,以及为什么你应该学习它。然后我们安装了它,并着手用该语言编写、构建和执行我们的第一个程序。