在 Linux 上安装 Go
在Linux上安装Go的步骤包括下载Go安装程序、提取并配置环境变量,以及确认安装是否成功。
在 Linux 上安装 Go
若要在 Linux 上安装 Go,请从 Go 下载页面下载 Go 安装程序。 如果出于某种原因,你已经安装 Go 并想要安装最新版本,请在继续操作之前删除现有版本。
步骤 1:下载 Go 安装程序
在 Go 下载页面的“精选下载”部分中,选择“Linux”选项。
可能会显示一个窗口,提示你允许从 golang.org 下载文件。如果是这样,请选择“允许”。
或者,可以通过在终端提示符下运行以下命令来下载安装程序:
如果在阅读本指南时,1.15.4 不是最新版本,则可能需要更改命令中的版本号。
wget https://golang.org/dl/go1.15.4.linux-amd64.tar.gz
步骤 2:提取 Go 安装程序 在本地下载 Go 安装程序后,可以开始在工作站上设置 Go。
在 /usr/local/go
提取安装程序,并以 root 身份或通过 sudo 运行以下命令:
tar -C /usr/local -xzf go1.15.4.linux-amd64.tar.gz
需要将路径 /usr/local/go/bin
添加到 $PATH 环境变量。 若要使 Go 在系统范围内可用,可以将以下命令添加到 $HOME/.profile 或 /etc/profile:
export PATH=$PATH:/usr/local/go/bin
需要关闭并重新打开终端提示符,以更新 $PATH 环境变量。 或者,可以通过运行以下命令强制更新:
source $HOME/.profile
步骤 3:确认是否已正确安装 Go 配置 Go 分发后,请运行以下命令来确认 Go 正常工作:
go version
应显示在工作站上安装的 Go 版本的详细信息。
组织代码项目
继续之前,请务必仔细阅读此部分。
Go 在组织项目文件方面与其他编程语言不同。 首先,Go 在工作区的概念之下工作,其中,工作区就是应用程序源代码所在的位置。 在 Go 中,所有项目共享同一个工作区。 不过,从版本 1.11 开始,Go 开始更改此方法。 你还不必担心,因为我们将在下一个模块中介绍工作区。 现在,Go 工作区位于 $HOME/go,但如果需要,可以为所有项目设置其他位置。
若要定义其他工作区位置,请将值设置为 $GOPATH 环境变量。 开始创建更复杂的项目时,需要为环境变量设置一个值,以避免将来出现问题。
在 macOS 或 Linux 中,可以通过将以下命令添加到 ~/.profile
来配置工作区:复制
export GOPATH=$HOME/go
然后运行以下命令以更新环境变量:
source ~/.profile
在 Windows 中,创建一个文件夹(例如 C:\Projects\Go
),你将在其中创建所有 Go 项目。 打开 PowerShell 提示符,然后运行以下命令:
[Environment]::SetEnvironmentVariable("GOPATH", "C:\Projects\Go", "User")
在 Go 中,可以通过打印 $GOPATH 环境变量的值来获取工作区位置,以供将来参考。 或者,可以通过运行以下命令获取与 Go 相关的环境变量:
go env
在 Go 工作区中,可以找到以下文件夹:
- bin:包含应用程序中的可执行文件。
- src:包括位于工作站中的所有应用程序源代码。
- pkg:包含可用库的已编译版本。 编译器可以链接这些库,而无需重新编译它们。
例如,工作站文件夹结构树的外观如下:
bin/
hello
coolapp
pkg/
github.com/gorilla/
mux.a
src/
github.com/golang/example/
.git/
hello/
hello.go
Go 不需要你在 if
、for
或 switch
语句的条件中添加括号。 但是,你始终需要添加大括号 ({}
)。 可以链接 if
语句,else
子句是可选的。 至关重要的是,可以在 if
条件中声明变量,其作用域仅限 if
块。 即使在同一函数中,也不能访问块外的这些变量。
Go 支持 switch
语句,你不需要编写条件。 只需使用 case
子句即可。 与其他语言不同的是,在 Go 中,无需在每个 case
子句末尾编写 break
语句来避免运行其他 case
子句。
默认情况下,Go 在进入 case
语句后就会运行它,然后退出 switch
子句。 若要跳转到下一个 case
子句,请使用 fallthrough
关键字。 可以从 case
子句调用函数,并且可以在一个 case
子句中将多个表达式分组。
在此模块中,你还了解到,在 Go 中只使用 for
关键字来编写循环。 但是,你可以编写无限循环或 while
条件。 Go 支持 continue
关键字,因此你可以在不退出循环的情况下跳过循环迭代。
最后,你了解了其他 Go 控制流,例如 defer
、panic
和 recover
函数。 Go 不支持异常。 它通过使用这三个函数的组合来处理运行时错误。
【示例】删除切片指定位置的元素。
package main
import "fmt"
func main() {
seq := []string{"a", "b", "c", "d", "e"}
// 指定删除位置
index := 2
// 查看删除位置之前的元素和之后的元素
fmt.Println(seq[:index], seq[index+1:])
// 将删除点前后的元素连接起来
seq = append(seq[:index], seq[index+1:]...)
fmt.Println(seq)
// fmt.Println([seq...])
}
代码输出结果:
[a b] [d e]
[a b d e]
代码说明如下:
- 第 1 行,声明一个整型切片,保存含有从 a 到 e 的字符串。
- 第 4 行,为了演示和讲解方便,使用 index 变量保存需要删除的元素位置。
- 第 7 行,seq[:index] 表示的就是被删除元素的前半部分,值为 [1 2],seq[index+1:] 表示的是被删除元素的后半部分,值为 [4 5]。
- 第 10 行,使用 append() 函数将两个切片连接起来。
- 第 12 行,输出连接好的新切片,此时,索引为 2 的元素已经被删除。
切片创建切片
切片之所以称为切片,是因为它只是对应底层数组的一部分,看如下所示代码:
func main() { slice := []int{10, 20, 30, 40, 50} newSlice := slice[1:3] }
需要记住的是,现在两个切片共享同一个底层数组。如果一个切片修改了该底层数组的共享部分,另一个切片也能感知到,运行下面的代码:
func main() { slice := []int{10, 20, 30, 40, 50} newSlice := slice[1:3] slice[1] = 200 fmt.Println(newSlice[0]) }
// 切片深拷贝示例 func test() { a := make([]int, 10) for i := 0; i < 10; i++ { a[i] = i } b := a[1:4] b[1] = 22 // 浅拷贝:值变化会影响到切片a var c = make([]int, 3) copy(c, b) c[1] = 222 // 深拷贝: 值变化不会影响到切片a、b fmt.Println(a) fmt.Println(b) fmt.Println(c) /** * * [0 1 22 3 4 5 6 7 8 9] * [1 22 3] * [1 222 3] * / }
你在本模块中学习了 4 种数据类型,它们将帮助你更好地表示你的程序将用于解决问题的数据。 我们首先了解了 Go 中的数组,如你所见,它很简单。 如果你一直在用其他语言编程,也没有太大区别。 但你需要了解数组的工作原理,才能理解我们探索的其他 3 种数据类型。
例如,你已了解到切片是一个简单的数据结构,它有一个指针指向一个基础数组,有两个属性用于控制该数组的长度和容量。 你不必担心切片的大小,因为 Go 会帮你“扩展”基础数组的大小。 你还了解到切片运算符可帮助你创建新的子切片并从切片中删除元素。
接着我们了解了映射,这是一种类似于切片和数组的数据结构。 区别是映射由键或值元素组成,其中键和值可以是不同的类型。 你还有一个内置函数可用于快速从映射中删除元素。 如果你尝试从不存在的映射访问位置,Go 不会引发 panic 错误。
最后,我们了解了 Go 中的结构,我们将在下一模块中继续讲解这一知识。 结构是不同类型的字段的集合,这些字段可用于表示数据库中的项。 如果需要,你也可将结构转换为 JSON 格式。
在后续模块中,我们将继续使用这些数据类型来探索 Go 中的其他功能。
如你所见,Go 中的错误处理和日志记录与其他编程语言中的这些过程不同。 首先,Go 的错误处理方法非常简单。 使用 if
条件,调用的函数应返回多个值。 按照惯例,最后一个返回值为错误。 如果错误变量返回 nil
,则不存在错误。 如果值不为 nil
,则存在失败。 只需再次返回错误即可将错误传播到堆栈,并且可以根据需要添加更多上下文。
可以创建可重用为程序中常见错误消息的返回值的错误变量。
你还需要了解何时使用 panic。 我们已介绍 panic
和 recover
的工作原理。 仅当明确需要停止程序时,才应使用这些函数。 有时,即使你正确处理了错误,程序也可能会停止响应。 但这应该是异常,而不是规则。
最后,我们探讨了 Go 中日志记录的工作原理,你了解了如何使用标准库。 除了将日志打印到控制台之外,你还可以将日志发送到文件供稍后处理,然后将它们发送到一个集中位置。 当代码库扩大时,你可能需要执行其他操作,例如设置日志级别或配置不同输出。 标准库中不支持这些任务。 你将需要使用记录框架,例如 zerolog。
此模块较短,但请务必充分了解相关概念。 在需要对程序中的问题进行故障排除时,它们将有所帮助。