任务1.1 安装Go语言环境

1.1.1 任务分析

Go语言是一门由谷歌公司于2009年11月正式发布的编程语言,它正在快速发展,并逐渐成为后台服务器开发的主流语言。在本任务中我们将了解Go语言的发展历程,包括Go语言的创始者、诞生背景、名字由来,Go语言的主要优势,以及支撑我国“建设现代化产业体系”的技术应用领域,等等。进一步地,我们将一同学习Go语言在Windows以及Linux系统中的安装、配置,剖析Go程序的基本结构。

1.1.2 相关知识

1.Go语言的发展历程

Go语言概况

Go语言诞生于2007年,并于2009年正式发布。Go语言是编程语言设计的又一次尝试,其目的是让程序开发者在开发程序时,可以在不损失应用程序性能的情况下降低代码的复杂性,其具有语言设计良好、应用程序部署简单、能够快速编译和执行的特点。Go 语言也是首门完全支持 UTF-8编码的编程语言,其源码文件格式使用的正是UTF-8编码,做到了真正的国际化。

Go语言主要发展历程如下。

2008年初,“UNIX之父”肯·汤普森(Ken Thompson)实现了第一版Go编译器。

2009年11月10日,谷歌官方宣布Go语言项目开源,这天也被Go官方确定为Go语言的“诞生日”。

2012年3月28日,Go 1正式发布,同时Go官方发布了“Go 1兼容性”承诺:只要符合Go 1语言规范的源码,Go编译器将保证向后兼容(backwards compatible)。

2015年8月19日,Go 1.5发布,这个版本被认为是历史性的。它完全移除了C语言部分,完全使用Go语言原生的编译器,少量代码使用汇编实现,降低了GC停顿(STW)问题,使得Go语言在服务端开发方面几乎弥补了所有的缺陷。

2018年8月24日,Go 1.11发布,这个版本引入了新的Go包管理机制Go Modules,用于解决Go包管理和依赖问题。

2021年2月16日,Go 1.16发布,这个版本将Go Modules做为默认包管理机制。同年8月16日Go 1.17发布,这个版本对编译器添加了传递函数参数和结果的新途径,使得Go语言程序的性能提高了约5%,并使amd64平台的二进制文件大小减少了约2%。

2022年3月15日。Go 1.18发布,这个版本增加了对泛型(Generics)、模糊测试(Fuzzing)、工作区(Workspaces)的支持。同年8月2日Go 1.19版本发布,对Go 1.18做了进一步的完善,并为文档注释增添了对链接、列表和更清晰的标题等语法的支持。

Go语言的主要发展历程如图1-1-1所示。

2.Go语言的特性

(1)编译快、效率高。

相较于Java和C++相对较慢的编译速度,Go语言的编译速度快是其主要的优势。Go语言摒弃了以往典型开发语言在使用过程中出现的弊病,使得程序的开发变得更快、更加容易。除了追求快速的编译和良好的开发体验之外,Go语言还能保证所开发程序的运行性能,这是因为它继承了C语言的要点:程序要编译成高效的机器码。总而言之,Go语言可以加快程序员的开发速度,并拥有和C/C++语言相差无几的性能。

图1-1-1 Go语言的主要发展历程

(2)易学习、成本低。

Go语言的语法与C语言的类似,但实际上它参考了多种语言的设计思想,实现了自动化的内存管理,没有构造或析构函数、运算符重载、继承和多态、异常、宏。因此,它足够简单,花几个星期学习它就能写出高性能的代码。

(3)强大的标准库。

Go 语言的标准库非常稳定且丰富多样,包括网络、系统、加密、编码、图形等各个方面。尤其是网络和系统的标准库非常实用,开发者在开发大型网络应用时,几乎无须依赖第三方库。

(4)简单的高并发。

Go 语言的 goroutine(线程并发)和 channel(goroutine 间的通信方式)的出现让并发和异步编程等问题的处理变得“优雅”和流畅。对多年使用C、C++、Java、Python和JavaScript这些语言并易受到并发和异步困扰的编程者来说,使用Go语言开发高并发程序的成本极低。

(5)便捷的应用。

Go语言拥有自己的链接器,不依赖任何系统提供的编译器和链接器,其编译出来的二进制可执行文件几乎可以运行在任何系统环境中。

(6)良好的规范。

不同的程序员有着不同的代码风格,对代码风格不一致的程序员来说,审核代码是一件痛苦的事情。Go语言带来代码规范的同时还拥有强大的编译检查、严格的编码规范和高度的稳定性,它提供了软件生命周期各个环节(如开发、测试、部署、维护等)的工具,包括go tool、go fmt、go test等。

(7)持续的发展。

Go语言的创造者和开源者可以说占尽了先机。谷歌公司聚集了一批极高水准的软件工程师,在各种编程语言“称雄争霸”的局面下推出新的编程语言。从Go语言的发展态势来看,谷歌公司对其十分看重,Go语言自然有一个良好的发展前景。社区的组织、维护和发展都将为Go语言未来进一步发展提供强有力的生态保证。

3.Go语言的应用领域

(1)服务器。

目前大多数服务器后端还是由C语言或C++开发的,从前面的Go语言的发展历程部分可以了解到:C语言或C++能做的事情,Go语言都可以做,并且由于Go语言的诸多优异特性,在大多数情况下,Go 语言还可以做得更好。Go 语言目前在服务器方面的落地应用有很多,例如数据打包、日志处理、文件系统、中间件、数据库、Web应用、应用程序接口(Application Program Interface,API)应用等。

(2)云计算。

Go语言又叫作“云计算时代”的C语言,它兼备开发效率和运行效率,又具有通信顺序进程(Communicating Sequential Processes,CSP)的并行特性,可以很好地满足人们在高并发场景中的开发需求。因此,很多云计算领域的公司都开始将Go语言作为核心技术栈,如京东的消息推送服务和分布式文件系统都是采用Go语言开发的,当前流行的容器软件Docker也是采用Go语言实现的。

(3)区块链。

区块链是一种分布式账本,本质上是一个可以在多个站点、不同地理位置或者由多个机构组成的网络里进行分享的资产数据库。区块链融合了很多核心技术,目前其主流开发语言正是Go语言。

(4)大数据、人工智能。

Go语言非常适合实现数据挖掘、分析和存储,与Python语言配合往往能够达到意想不到的效果。目前国内的Pholcus(爬虫)、TiDB(数据库)正是使用Go语言开发的,并取得了较大的成果。其次在人工智能领域,主要由谷歌公司推动,目前的工作是针对TensorFlow编写各种API。

4.Go程序运行环境

程序员在编写完一段Go程序之后,并非立刻就能获得一个可以直接执行的文件,而需要经过一个叫作编译的过程。编译就是把高级语言变成计算机可以识别的二进制语言。因为计算机只能处理由1和0表示的代码,所以Go语言使用编译器来编译代码,将源码编译成二进制(或字节码)格式。在编译代码时,编译器会检查错误、优化性能并输出可在不同平台上运行的二进制文件。

因此要创建并运行Go程序,必须遵循以下4个步骤:

(1)使用文本编辑器创建Go源码文件。

(2)保存文件。

(3)编译程序。

(4)运行编译得到的可执行文件。

Go程序可执行文件的运行依赖于操作系统的环境变量。环境变量相当于给系统或用户应用程序设置的一些参数,如 PATH 环境变量,它告诉系统除了在当前路径寻找程序外,还应该到PATH指定的路径中去寻找。以Windows为例,Go语言的核心环境变量如表1-1-1所示。

以上涉及的与Go语言相关的文件或工具都在官方所提供的开发工具包内,并且安装版的开发工具包可以帮助我们自动配置大部分的环境变量,能够让初学者轻而易举地搭建Go语言开发环境。

表1-1-1 Go语言的核心环境变量

1.1.3 实操过程

在Windows系统中安装Go语言开发环境

步骤一:在Windows系统中安装Go语言开发环境

在本步骤中,我们将从Go语言官网上下载Windows系统下的Go语言开发工具包,并将其安装到我们的计算机上,具体操作如下。

首先访问Go语言官网,在官网内找到Windows系统下的Go语言开发工具包(go1.17.5.windows-amd64.msi)的下载链接,如图1-1-2所示。

图1-1-2 Windows系统下的Go语言开发工具包下载界面

单击链接下载后,获得Go语言开发工具包,双击它进入安装程序的欢迎页,单击“Next”按钮。在弹出的Go语言用户许可协议界面,选择同意协议才可以安装该开发工具包,否则无法进行安装。因此直接勾选“I accept the terms in the License Agreement”复选框,然后单击“Next”按钮即可,如图1-1-3所示。

图1-1-3 Go语言用户许可协议界面

接下来将设置 Go 语言开发工具包的安装路径。在 Windows 系统中,默认情况下将其安装到 C:\Program Files\Go\目录下。当然,也可以自行选择其他的安装目录,在确认无误后单击“Next”按钮,如图1-1-4所示。

图1-1-4 选择安装目录

Go 语言开发工具包的安装没有其他需要设置的复杂选项,因此直接单击“Install”按钮便可开始安装,如图1-1-5所示。

图1-1-5 确认安装

等待程序完成安装,然后单击“Finish”按钮退出安装程序,如图1-1-6所示。

图1-1-6 退出安装程序

Go语言开发工具包程序安装完成后,并不代表Go语言开发环境就可以使用了。我们还需要配置GOPATH环境变量,之后才可以使用Go语言进行开发。

GOPATH是Go语言的工作目录,是一个用来存放代码包的路径,使用Go语言编写的程序都会被存放在该工作目录下,因此配置一个合适的GOPATH工作目录是非常有必要的。

GOPATH的配置很简单,在桌面或者资源管理器中右击“此电脑”(或者“我的电脑”),然后单击“属性”→“高级系统设置”→“环境变量”按钮,如图1-1-7所示。

图1-1-7 打开环境变量

在弹出的界面里找到GOPATH对应的项,单击“编辑”按钮之后就可以对其进行修改了,如图1-1-8所示。若GOPATH变量不存在,可以单击“新建”,并在弹出的界面中将变量名填写为 GOPATH,变量值设置为任意目录均可(尽量选择空目录),如 E:\Go,配置完成后单击“确定”按钮即可。

图1-1-8 编辑GOPATH环境变量

步骤二:对安装的Go语言开发环境进行验证

在步骤一中,我们完成了Go语言开发工具包的安装和环境变量的配置,接下来我们应当进行验证,以此来确保Go语言开发环境的正确安装和配置,具体操作如下。

打开Windows系统的命令提示符(或Windows PowerShell)窗口,通过输入go env命令来测试Go语言开发环境是否安装成功,如图1-1-9所示。

图1-1-9 通过命令提示符窗口测试开发环境是否安装成功

Go语言内含一套完整的命令操作工具,go命令就是其中之一(具体的应用会在后续的项目中讲解)。env是environment的缩写,配合go命令可以对本机的Go语言开发环境进行查看,开发者可以以此为根据去判断步骤一的安装是否成功。

1.1.4 进阶技能

在Linux系统中安装Go语言开发环境

进阶一:在Linux系统中安装Go语言开发环境

在本进阶中,我们将从Go语言官网上获取Linux系统下的Go语言开发工具包,并将其安装到我们的计算机上,具体操作如下。

首先访问Go语言官网,在官网内找到Linux系统下的Go语言开发工具包的下载链接,右击下载链接,选择“复制链接地址”取得Linux系统下的Go语言开发工具包的下载链接,如图1-1-10所示。

图1-1-10 获取Linux系统下的Go语言开发工具包下载链接

然后在Linux终端中,首先使用cd命令进入用来存放Go语言开发工具包的目录,这里以存放在/mnt目录中为例。

cd /mnt

其次,将复制得到的下载链接作为wget命令的参数,对Go语言开发工具包进行下载。

wget https://golang.google.cn/dl/go1.17.5.linux-amd64.tar.gz

再次,使用tar命令解压刚刚下载的Go语言开发工具包,解压成功后会在当前目录下新增一个go目录。

tar -C /usr/local -xzf go1.17.5.linux-amd64.tar.gz

至此,Go语言开发工具包的安装就完成了。使用cd命令进入go目录,然后执行bin/go version命令,可以查看当前Go语言的版本。

cd /usr/local/go
bin/go version

虽然目前已经可以使用Go语言开发环境,但是为了方便使用,还需要配置环境变量。在Linux系统中,环境变量配置文件是/etc/profile,因此我们可以使用vi编辑器,打开环境变量配置文件并编辑。

vim /etc/profile

在环境变量配置文件的末尾添加环境变量设置,首先设置GOROOT的值为Go语言开发工具包的安装目录。

export GOROOT=/usr/local/go

其次配置PATH变量,这是为了方便在任意目录下使用Go语言命令和Go程序可执行文件。需要在PATH上追加如下内容。

export PATH=$PATH:$GOROOT/bin

除了在环境变量配置文件中配置环境变量,我们还可以选择在用户环境变量配置文件中配置。

~/.bash_profile

~/.bashrc

如果是单用户使用,可以将环境变量添加在当前用户目录下的“.bash_profile”文件中。如果是多用户使用,则建议添加在“/etc/profile”文件中。最后使用source命令让配置文件生效。

source /etc/profile

此时就可以在任意目录下使用Go语言命令了。

进阶二:对安装的Go语言开发环境进行验证

在Linux系统中安装Go语言开发工具包并配置环境变量后,还需要对其进行验证,以此来确保Go语言开发环境的正确安装和配置,具体操作如下。

将目录切换到任意目录(这里以根目录为例),然后输入 go 命令,查看是否可以正常运行,如果出现如下内容即代表Go语言开发环境安装配置成功。

  Go is a tool for managing Go source code.
  Usage:
    go <command> [arguments]
  The commands are:
    bug    start a bug report
    build   compile packages and dependencies
    clean   remove object files and cached files
  ……