第1章 初识Go语言
Go语言的主要设计者有3个人,他们都是计算机科学领域的杰出人物,即肯·汤普森(Ken Thompson)、罗伯·派克(Rob Pike)和罗伯特·格利茨默(Robert Griesemer)。为了避开在C++开发中等待编译完成的过程,并满足谷歌的需求,他们凭借各自的经验和智慧,耗时两年设计出Go语言,并让Go语言具备了动态语言的便利性。
本章的知识架构及重难点如下。
1.1 Go语言简介
Go语言(又称Golang)起源于2007年,正式对外发布于2009年。开发Go语言是为了在不损失应用程序性能的前提下降低代码的复杂性。Go语言是类C语言,而且是经过重大改进的类C语言。Go语言继承了C语言的表达式、基础数据类型、调用参数传值、指针等。此外,Go语言具有很好的编译后机器码的运行效率,并且它有与现有操作系统的无缝适配等特性。使用Go语言不仅能够访问底层操作系统,还能够进行网络编程和并发编程。了解了上述关于Go语言的概括内容后,下面开始学习Go语言。
1.1.1 为什么要学习Go语言
Go语言没有类和继承的概念,这与Java或C++不同。此外,Go语言具备清晰易懂的轻量级类型系统,使其在类型之间没有层级关系。这是因为设计者在设计Go语言时,同时借鉴了Pascal语言、Oberon语言和C语言,并取其精华。因此,Go语言是一门混合型的编程语言。
Go语言不仅具有Python等动态语言的开发速度,而且具备C、C++等编译型语言的性能和安全性,还具备“部署简单、并发性良好、语言设计良好、执行性能好”等优势。
在Go语言正式对外发布之前,如果需要编写系统程序或者网络程序,那么开发者经常面临这样一个问题:是使用执行效率高、编译速度较慢的C++,还是使用编译速度快、执行效率较低的.NET或者Java,抑或是使用一门开发难度低、执行效率一般的动态编程语言呢?
在Go语言正式对外发布之后,开发者发现Go语言能够在编译速度、执行效率和开发难度上找到很好的平衡点,进而达到“快速编译,高效执行,易于开发”的目的。
Go语言使用自带的编译器编译代码。编译器将源代码编译成二进制(或字节码)格式;在编译代码时,编译器检查错误、优化性能并输出可在不同平台上运行的二进制文件。Go语言支持交叉编译,例如,在Linux系统的计算机上使用Go语言能够开发可以在Windows系统的计算机上运行的应用程序。这使得Go语言成为一门跨系统平台的编程语言。
1.1.2 Go语言的特性
明确Go语言的设计初衷后,下面具体介绍Go语言的主要特性。
语法简单
Go语言的语法规则严谨,没有歧义,没有变异用法,这使每位开发者编写的代码都大致相同,让应用程序具有良好的可维护性。
并发模型
Go语言从根本上让一切都并发化。在运行Go语言应用程序时,使用goroutine运行一切。goroutine是Go语言的重要特征。goroutine让Go语言通过语法实现并发编程变得更容易,无须处理回调,而且不用关注线程切换。
内存分配
将一切并发化带来一个难题:如何实现高并发下的内存分配和管理,为此,Go语言使用为并发而设计的高性能内存分配组件tcmalloc。
标准库
Go语言标准库极其丰富,在不借助第三方扩展插件的情况下,能够完成大部分基础功能的开发工作。此外,Go语言还拥有许多优秀的第三方资源,这让Go语言从近年来几门新出现的编程语言中脱颖而出。
工具链
完整的工具链对于日常开发极为重要。Go语言无论是在编译、格式化、错误检查、帮助文档等方面,还是在第三方包下载、更新等方面都有对应的工具。
1.1.3 Go语言与并发
早期的CPU都是以单核的形式顺序执行机器指令的。顺序是指所有的指令都以串行的方式执行,在同一时刻有且仅有一个CPU在执行机器指令。随着处理器由单核时代向多核时代发展,编程语言也逐步向并发的方向发展。
Go语言就是在时代发展的背景下产生的支持并发的一门编程语言。Go语言从底层原生支持并发,开发者无须使用第三方库就能够轻松地在编写程序时分配CPU资源。
Go语言是在goroutine的基础上实现并发的。goroutine被视为一种虚拟线程,但goroutine不是线程。Go语言在运行应用程序时会参与调度goroutine,把goroutine合理地分配给每个CPU,进而最大限度地使用CPU。
在多个goroutine之间,Go语言使用通道(channel)进行通信(通道是一种内置的数据结构)。也就是说,Go语言使用通道能够在不同的goroutine之间同步发送消息。
如果把并发设计为生产者和消费者的模式,那么就要把在不同goroutine之间同步发送的消息放入通道,把并发设计为生产者和消费者的模式如图1.1所示。
图1.1 把并发设计为生产者和消费者的模式
1.1.4 Go语言的应用
Go语言从发布1.0版本以来,因其简单、高效、并发的特性受到广大开发者的关注,进而被广泛使用。鉴于Go语言的设计初衷和特性,其主要应用领域如下。
服务器编程。如处理日志、数据打包、虚拟机处理、文件系统等。
分布式系统、数据库代理、中间件等。
网络编程。如Web应用、API应用、下载应用等。Go语言非常适合完成网络并发服务,在这个领域内被广泛应用;其内置的net/http包基本上把日常应用程序开发所需的网络功能都实现了。
数据库操作。
云平台领域。Go语言发布后,很多公司(尤其是云计算公司)开始用它重构云平台的基础架构,如阿里中间件、聚美优品、斗鱼直播、人人车、招财猫、美餐网等。
1.2 Go语言开发环境
搭建Go语言的开发环境要在Go语言的官网上下载Go语言开发包。Go语言开发包可以安装在Linux系统、FreeBSD系统、Mac OS系统和Windows系统上。本节将以Windows系统为例,讲解搭建Go语言开发环境的具体步骤。
1.2.1 下载Go语言开发包
打开浏览器,输入网址https://golang.google.cn/dl/后按Enter键,即可打开如图1.2所示的Go语言官网首页。
图1.2 Go语言官网的下载页面
说明
因为Go语言官网持续更新,并且通常更新的版本会向下兼容,所以读者根据自己的计算机系统下载最新版本的Go语言开发包即可。
笔者当前的CPU系统是64位Windows系统,所以要下载64位的Go语言开发包。单击图1.2中使用矩形边框标记的超链接,弹出如图1.3所示的“新建下载任务”对话框,笔者把64位Go语言开发包下载到D:\GO路径下,单击“下载”按钮。
图1.3 “新建下载任务”对话框
说明
如果当前CPU系统是32位Windows系统,那么就需要下载能够安装在32位Windows系统上的Go语言开发包。使用鼠标滚轮向下滚动Go语言官网的首页,找到与64位Windows系统同版本的32位Windows系统的Go语言开发包,单击如图1.4所示的超链接即可。
图1.4 32位Windows系统的Go语言开发包
1.2.2 安装Go语言开发包
按照下载路径D:\GO,即可在D盘下的Go文件夹中找到如图1.5所示的64位的Go语言开发包。双击Go语言开发包。
打开如图1.6所示的Go语言开发包的安装对话框后,单击Next按钮。
图1.5 64位的Go语言开发包
图1.6 用于安装64位Windows系统的Go语言开发包的对话框
打开如图1.7所示的End-User License Agreement(用户许可协议)对话框后,先选中I accept the terms in the License Agreement复选框,再单击Next按钮。
打开如图1.8所示的Destination Folder(目标文件夹)对话框,单击Change按钮把目标文件夹路径设置为D:\GO,再单击Next按钮。
图1.7 “用户许可协议”对话框
图1.8 “目标文件夹”对话框
打开如图1.9所示的Ready to install Go Programming Language amd64 go1.20.2(准备安装Go语言开发包)对话框后,单击Install按钮。
Go语言开发包安装完毕后,弹出如图1.10所示的完成安装Go语言开发包的对话框,单击Finish按钮。
图1.9 “准备安装Go语言开发包”对话框
图1.10 完成安装Go语言开发包的对话框
再次打开如图1.11所示的D盘下的Go文件夹,发现新生成了许多文件和文件夹。其中,api文件夹的主要内容是Go语言每个版本的api变更差异;bin文件夹是Go语言的编译器、文档工具和格式化工具;doc文件夹是英文版的Go语言文档;lib文件夹是Go语言可以引用的一些库文件;src文件夹是标准库的源码;test文件夹是Go语言用于测试的实例。
图1.11 在D盘下的Go文件夹中新生成的文件和文件夹
1.2.3 配置Go语言环境变量
在Windows 10系统的桌面上,找到并右击“此电脑”图标,在弹出的快捷菜单中选择“属性”命令,如图1.12所示。
在如图1.13所示的对话框的左侧,单击“高级系统设置”超链接。
图1.12 选择“属性”命令
图1.13 单击“高级系统设置”超链接
在如图1.14所示的“系统属性”对话框中,单击“环境变量”按钮。
如图1.15所示,单击“新建”按钮,分别输入变量名GOROOT和变量值D:\GO,再单击“确定”按钮。这样就成功地把Go语言开发包的安装路径添加到环境变量中了。
图1.14 打开“环境变量”对话框
图1.15 新建环境变量GOROOT
如图1.16所示,先单击“新建”按钮,分别输入变量名GOPATH和变量值D:\GoProject,再单击“确定”按钮。这样就成功地把开发Go项目的路径添加到环境变量中了。
图1.16 新建环境变量GOPATH
如图1.17所示,先单击“新建”按钮,分别输入变量名GOPROXY和变量值https://goproxy.io,再单击“确定”按钮。这样就把用于下载第三方包的GOPROXY代理添加到环境变量中了。
图1.17 新建环境变量GOPROXY
如图1.18所示,在“环境变量”对话框中双击环境变量Path。
如图1.19所示,单击“新建”按钮,分别把D:\GO、D:\GO\bin、%GOROOT%\bin和%GOPATH%\bin添加到Path中。
图1.18 打开环境变量Path
图1.19 编辑环境变量Path
最后,逐一单击“确定”按钮,返回上一级。这样Go语言环境变量就配置成功了。
1.2.4 测试Go语言开发包是否正常运行
Go语言开发包安装完毕后,需要测试它能否正常运行。在Windows系统下先单击桌面左下角的图标;再在下方的搜索框中输入cmd,如图1.20所示;然后按Enter键,打开命令提示符对话框。
在命令提示符对话框中输入go env命令,按Enter键后,将显示如图1.21所示的Go语言开发包的相关信息,这说明Go语言开发包已经安装成功。
图1.20 打开命令提示符对话框
图1.21 显示Go语言开发包的相关信息
说明
“set GO111MODULE=on”这个配置项让Go语言使用Module,禁止Go命令行在GOPATH目录下查找源文件。Module是相关Go包的集合,是源代码交换和版本控制的单元。Go命令行支持使用Module记录和解析对其他模块的依赖性。也就是说,Module可以替代GOPATH,指定Go命令行查找源文件。
1.3 Go语言开发工具
Go语言开发工具主要是为Go语言提供编码辅助和内置工具。那么,Go语言开发工具应该具备哪些主要特点呢?
语法高亮。
匹配括号和括号补全。
查找和替换功能。
检查编译错误。
在Linux系统、Mac OS系统和Windows系统下正常工作。
通过第三方库扩展或者替换某个功能。
代码自动补全和代码折叠。
运行程序和调试程序。
下面推荐几款常用的Go语言开发工具。
Goland。它是由JetBrains公司开发的商业Go语言开发工具(需付费)。
LiteIDE。它是一款非常好用的、轻量级的Go语言开发工具。对代码编写、自动补全和程序的运行调试都能很好地支持。
GoClipse。它是一款Eclipse插件,虽然使用它需要安装JDK,但它拥有Eclipse的诸多功能。
VS Code(Visual Studio Code)。它是一款由微软开发的、跨平台的免费开发工具,不但具有语法高亮、代码自动补全、代码重构等功能,而且内置命令行工具和Git版本控制系统,还可以通过内置的“扩展商店”安装扩展插件以拓展其功能。
本书把VS Code作为Go语言开发工具。本节将介绍如何在Windows系统下下载、安装和汉化VS Code。
1.3.1 下载VS Code
打开浏览器,输入网址https://code.visualstudio.com/按Enter键,即可打开如图1.22所示的VS Code官网首页。单击Download按钮。
图1.22 VS Code官网首页
打开如图1.23所示的VS Code下载页面,单击Windows系统版块下方与System Installer标签对应的64 bit按钮。
图1.23 VS Code的下载页面
说明
如果当前CPU系统是32位Windows系统,就要单击Windows系统版块下方与System Installer标签对应的32 bit按钮。
这时,弹出如图1.24所示的“新建下载任务”对话框,笔者把64位Windows系统的VS Code下载到D:\VSCode路径下。
图1.24 “新建下载任务”对话框
1.3.2 安装VS Code
按照下载路径D:\VSCode,可在D盘的VS Code文件夹中找到如图1.25所示的64位VS Code安装包。双击该安装包。
图1.25 64位Windows系统的VS Code安装包
弹出如图1.26所示的“许可协议”对话框,选中“我同意此协议”单选按钮,单击“下一步”按钮。
弹出如图1.27所示的“选择目标位置”对话框,单击“浏览”按钮,设置安装路径为D:\VSCode\Microsoft VS Code,再单击“下一步”按钮。
弹出如图1.28所示的“选择开始菜单文件夹”对话框,“选择开始菜单文件夹”的默认设置为Visual Studio Code。此处不做修改,单击“下一步”按钮。
弹出如图1.29所示的“选择附加任务”对话框,选中所有复选框,单击“下一步”按钮。
图1.26 “许可协议”对话框
图1.27 “选择目标位置”对话框
图1.28 “选择开始菜单文件夹”对话框
图1.29 “选择附加任务”对话框
弹出如图1.30所示的“准备安装”对话框,检查VS Code的安装路径、开始菜单文件夹和附加任务是否与之前设置的内容一致。检测无误后,单击“安装”按钮。
Go语言开发工具包安装完后,弹出如图1.31所示的“Visual Studio Code安装完成”对话框,选中“运行Visual Studio Code”复选框,单击“完成”按钮。
图1.30 “准备安装”对话框
图1.31 “Visual Studio Code安装完成”对话框
1.3.3 汉化VS Code
关闭VS Code的安装程序后,VS Code自动运行,VS Code界面如图1.32所示。这时,在VS Code界面的右下角弹出“安装语言包并将显示语言更改为中文(简体)”窗口。单击“安装并重启”按钮,即可对VS Code执行汉化操作。
图1.32 VS Code界面
说明
如果VS Code界面中的弹窗消失,单击VS Code界面右下角的“通知”图标即可显示弹窗。
VS Code的汉化需要持续一段时间。在这段时间内,不要对VS Code进行任何操作。VS Code成功汉化后,弹出如图1.33所示的VS Code界面。
图1.33 汉化后的VS Code界面
1.3.4 在VS Code中安装Go语言插件
虽然VS Code默认不支持Go语言,但是开发者可以从VS Code的扩展商店里安装Go语言插件,使VS Code支持Go语言。
如图1.34所示,在汉化后的VS Code界面中,单击“扩展商店”图标,在搜索文本框中输入go,按Enter键。在VS Code界面的左侧显示的搜索结果中找到Go语言插件,单击与其对应的“安装”按钮。
VS Code成功安装Go语言插件后,显示如图1.35所示的界面。
图1.34 搜索并安装Go语言插件
图1.35 VS Code成功安装Go语言插件后的界面
1.4 第一个Go语言程序
前几节介绍了如何下载、安装Go语言开发环境,以及如何下载、安装、汉化开发工具VS Code,还在VS Code中安装了Go语言插件。下面讲解如何使用VS Code编写第一个Go语言程序。
1.4.1 创建Go项目和Go文件
关闭并重新打开VS Code后,VS Code显示如图1.36所示的界面。选择“开始”命令。
图1.36 选择“开始”命令
在如图1.37所示的界面中,选择“新建文件”命令。
跳转到如图1.38所示的界面,选择文本框下方的“文本文件”命令。
在如图1.39所示的界面中,选择“选择语言”命令。
图1.37 选择“新建文件”命令
图1.38 选择“文本文件”命令
图1.39 选择“选择语言”命令
跳转到如图1.40所示的界面后,选择“Go (go)”命令。
图1.40 选择“Go (go)”命令
跳转到如图1.41所示的界面后,在界面的右下角弹出一个窗口。这个窗口的提示内容是“需要安装Go语言需要的第三方插件”。单击Install All按钮进行安装。
图1.41 单击Install All按钮
如图1.42所示,待“输出”下方出现“All tools successfully Installed. You are ready to Go.”这一提示信息,说明Go语言依赖的第三方插件成功安装了。
在D:\GoProject路径下,新建空文件夹GoDemos,单击如图1.42所示的“打开文件夹”按钮,打开文件选择对话框,选择GoDemos文件夹作为Go语言程序的项目文件夹。
在VS Code弹出的如图1.43所示的对话框中,选中“信任父文件夹‘GoProject’中所有文件的作者”复选框,单击“是,我信任此作者 信任文件夹并启用所有功能”按钮。
图1.42 单击“打开文件夹”按钮
图1.43 “是否信任此文件夹的文件的作者”对话框
跳转到如图1.44所示的界面后,在这个界面的左上角即可看到第一个Go语言程序所在的项目文件夹,即GODEMOS(GoDemos中的字母全部都大写)。
注意
当VS Code提示有新内容更新(在如图1.39所示的界面中的左下角)时,需要及时更新VS Code。
如图1.45所示,当把鼠标光标移动到GODEMOS项目文件夹附近时,VS Code会闪现出4个图标。单击左侧的第一个图标,新建Go文件。
图1.44 Go语言程序项目文件夹
图1.45 新建Go文件
如图1.46所示,VS Code在GODEMOS项目文件夹的下方添加一个文本框。在这个文本框里,输入Go文件的文件名demo_01.go后,按Enter键。
注意
Go文件的文件扩展名为go,在命名Go文件时,不能省略文件扩展名。
图1.46 命名Go文件
新建Go文件后,VS Code的界面如图1.47所示。
图1.47 新建Go文件后的VS Code界面
1.4.2 编写第一个Go语言程序
本节的主要内容有两个,一个是在新建的Go文件中编写第一个Go语言程序;另一个是讲解第一个Go语言程序。
【例1.1】换行输出和不换行输出(实例位置:资源包\TM\sl\1\1)
在新建的Go文件中,首先使用package关键字声明main包,然后使用import关键字导入fmt包,接着使用func关键字声明main()函数,最后分别调用fmt包中的Println()函数和Print()函数打印hello,world和“你好,世界”。代码如下。
虽然通过实现代码上方的文字描述能够了解第一个Go语言程序的编写步骤,但是无法明确每一行代码的含义。下面将对第一个Go语言程序的实现代码进行解析。
在Go语言中,“包”是管理单位,每个Go文件首先要使用package关键字声明其所属的包。
main包是Go语言程序的入口包,Go语言程序必须有且仅有一个main包。Go语言程序如果没有main包,在编译时会出错,无法生成可执行文件。
声明main包后,使用import关键字导入当前Go语言程序依赖的包,并且使用英文格式下的双引号引用这个包的名字。
fmt包是Go语言的标准库,用于格式化输出数据和扫描输入数据。
在Go语言中,使用func关键字声明函数。
main()函数是Go语言程序的入口函数,只能声明在main包中,不能声明在其他包中。
Println()函数是fmt包中的基础函数,其作用是输出数据,并且在数据的末尾使用换行符,使数据末尾处的光标出现在下一行,实现换行效果。
Print()函数也是fmt包中的基础函数,其作用也是输出数据;与Println()函数不同的是,Print()函数在数据的末尾没有使用换行符,使光标停留在数据的末尾,实现不换行效果。
1.4.3 运行Go语言程序
在新建的demo_01.go文件中编写完成第一个Go语言程序后,VS Code的界面如图1.48所示。
那么,在VS Code中如何运行例1.1呢?为了解决这个问题,需要在VS Code中安装Code Runner插件。
如图1.49所示,在汉化后的VS Code界面中,单击“扩展商店”按钮,在搜索文本框中输入code runner,然后按Enter键。在VS Code界面的左侧列出的搜索结果中找到Code Runner插件,单击与其对应的“安装”按钮。
图1.48 第一个Go语言程序完成后VS Code的界面
图1.49 搜索并安装Code Runner插件
安装Code Runner插件后,VS Code显示如图1.50所示的界面。单击关闭“扩展Code Runner”窗口。
图1.50 VS Code成功安装Go语言插件后的界面
关闭“扩展Code Runner”窗口后,VS Code显示如图1.51所示的界面。对比图1.48,发现在如图1.51所示的界面的右上角多了一个图标。图标就是运行Go语言程序的快捷方式。单击图标运行例1.1。
图1.51 关闭“扩展Code Runner”窗口后VS Code界面
如图1.52所示,例1.1的运行结果出现在VS Code界面右下方的“输出”窗口内。
图1.52 例1.1的运行结果
1.5 要点回顾
通过学习本章,读者能够明确什么是Go语言、为什么学习Go语言、Go语言的特性和应用、Go语言与并发的关系、在Windows系统中搭建Go环境的方法、在使用Go语言开发工具前的准备工作等内容。此外,通过解析第一个Go程序的编写和运行过程,使读者既能够熟悉Go语言的编码方式,又能够进一步明确Go语言开发工具的使用方法。