Go 安装&环境配置

安装

安装完成后在终端输入go version 确认是否安装成功

Untitled

相关配置

GOPATH配置

GOPATH 是 Go 语言中的一个环境变量,它指向一个工作空间(Workspace)目录,包含了许多 Go 项目和它们的相关源代码、二进制文件和第三方依赖包等内容。同时,该目录也是 Go 工具链(如 go、go build、go install)默认搜索的目录。

通常情况下,我们在设置 GOPATH 时会将其设置为一个目录,例如:**/Users/username/go,并在该目录下创建三个子目录:srcpkg** 和 **bin**。其中,

  • src 目录用于保存 Go 项目的源代码;
  • pkg 目录用于保存 Go 项目的依赖包;
  • bin 目录用于保存 Go 项目的二进制可执行文件。

Go 项目需要放在 GOPATH/src 目录下,通常的组织方式是在 src 目录下为每个项目创建一个独立的目录,然后将项目的源代码放在该目录下。在项目中使用的第三方依赖包也会被安装在 GOPATH/pkg 目录下,二进制可执行文件则会被保存在 GOPATH/bin 目录下。

需要注意的是,如果你想要在一个项目中使用另一个项目的代码,可以将这个项目的代码放在 GOPATH/src 目录下,然后在代码中通过 import 引入该项目即可。此外,Go 1.11 之后的版本支持使用 go modules 管理依赖包,不再需要依赖于 GOPATH 的设置。

GO PROXY

Go Proxy是一种Go模块的代理服务器,可以用于在Go项目中下载和管理依赖的模块。在Go Proxy服务器上,用户可以上传和存储自己的模块,并提供对其他用户的模块访问。Go Proxy服务器可以减轻Go项目中依赖管理的复杂性,提高依赖下载的速度,并且可以在团队协作中方便地共享依赖。在Go 1.13及以上的版本中,默认使用**https://proxy.golang.org作为Go**
Proxy。除了官方提供的Go Proxy,还有其他的第三方Go Proxy,比如Athens、goproxy.io等。

goproxy 是 Go 语言包管理工具 go mod 的一个重要概念,它提供了 Go 包的下载服务,使得我们可以更加方便地管理和维护 Go 项目所依赖的第三方库。

当我们使用 go mod 管理 Go 项目依赖的第三方库时,会通过引入 go.mod 文件来指定依赖的包和版本,Go 编译器会根据 go.mod 文件中的信息自动下载并缓存所需的包。

但是,如果要下载的包不在缓存中,或者缓存中的包版本不符合要求,Go 编译器就需要到远程服务器上下载包,而这个过程需要消耗大量的时间和带宽资源。

为了解决这个问题,可以使用 goproxy 代理服务器,它会缓存下载的包,以提高下载速度,并且还可以自动将所下载的包缓存到本地磁盘中,以便下次使用。

同时,由于 goproxy 会缓存包的版本信息,因此可以避免由于依赖包版本不一致而引起的问题,使得 Go 项目更加稳定和可靠。

GO Module

要使用 Go module,需要使用 Go 1.11 或更新版本。在 Go 1.11 及以上版本中,默认启用 Go module。

要在 Go 1.11 之前的版本中使用 Go module,需要先通过设置环境变量 GO111MODULE=on 开启 Go module 功能。可以将其设置为永久性环境变量或者在需要使用 Go module 的项目根目录中创建一个名为 go.mod 的文件,Go module 功能将自动开启。

启用 Go Module 后,GOPATH 的角色会发生变化。在启用 Go Module 后,GOPATH 只用于存储全局安装的二进制文件和一些依赖包缓存,而不再被用于存储项目源代码。

当你在使用 Go Module 开发项目时,项目代码不必再存储在 GOPATH 的 src 目录下,而是可以存放在任意位置。当你在使用 go build 或者 go run 命令时,Go 会自动检测项目代码中的依赖项,并从 go.mod 文件中读取依赖的版本信息,从而下载需要的依赖包并编译你的项目。

因此,可以说在启用 Go Module 后,GOPATH 的角色被缩小了,它不再是你项目源代码的必须存储位置,而只是用来存储全局安装的二进制文件和依赖包缓存的地方。

go.mod

go.mod文件是Go Module机制中的核心文件,用于管理模块的依赖关系和版本信息。它通常位于模块的根目录下。

go.mod文件的主要作用如下:

  1. 管理模块的依赖关系,列出所依赖的其他模块,并指定它们的版本信息。
  2. 确定模块的名称和版本号,并指定它们在引用时的别名。
  3. 记录当前使用的Go版本,并指定需要的最低版本。

下面是一个简单的go.mod文件示例:

1
2
3
4
5
6
7
8
module github.com/example/mymodule

go 1.16

require (
github.com/some/dependency v1.2.3
github.com/another/dependency v0.1.0
)

其中:

  • 第一行指定模块的名称和导入路径。
  • 第二行指定使用的Go版本。
  • require块列出所依赖的其他模块和版本信息。

当我们使用go命令进行构建或下载依赖时,go.mod文件会被自动更新以反映当前的依赖关系。同时,go.mod文件也可以手动编辑来管理依赖和版本信息。

go.mod 文件中,每个模块都用 module 关键字和模块路径来定义,例如:

1
module example.com/mymodule

然后可以使用 require 关键字来指定依赖的模块及其版本,例如:

1
2
3
4
require (
example.com/mymodule2 v1.0.0
example.com/mymodule3 v2.0.0
)

这表示当前模块依赖于 example.com/mymodule2 版本为 v1.0.0example.com/mymodule3 版本为 **v2.0.0**。可以在这个 require 块中列出所有的依赖项。

go.mod 文件中还可以使用 replace 关键字来替换依赖项。这在测试或调试期间非常有用。例如:

1
replace example.com/mymodule2 => ../mymodule2

这将 example.com/mymodule2 的依赖项替换为当前目录中的 **mymodule2**。这在开发期间可以很方便地调试和测试依赖项。

最后,在 go.mod 文件中可以使用 go 关键字来指定当前模块的 Go 版本,例如:

1
go 1.17

这将指定当前模块的 Go 版本为 1.17。

编辑完 go.mod 文件后,可以使用 go build 命令重新构建依赖项。**go build** 命令会自动检查和下载依赖项的正确版本。

go.sum

go.sum 是 Go Modules 的一个重要文件,它记录了当前项目所使用的所有模块(包括直接依赖和间接依赖)的版本信息和哈希值。

具体来说,当在 go.mod 中添加或者更新了一个依赖项时,Go 会根据 go.mod 文件自动下载该依赖项所需的全部模块,并在下载完毕后计算每个模块的哈希值。这些哈希值就会被记录在 go.sum 文件中。这个过程保证了在后续构建或者部署时,所使用的依赖项的版本和哈希值都是与开发过程中保持一致的。

同时,**go.sum** 文件也可以保证模块的安全性,因为它记录了模块的哈希值,可以在构建和部署时验证依赖项的完整性,以防止恶意代码或不良依赖项的入侵。如果 go.sum 文件被篡改了,构建或部署过程将会被中断,以提醒开发者注意安全问题。

总之,**go.sum** 文件在 Go Modules 的使用过程中扮演了至关重要的角色,它确保了依赖项的一致性、版本管理和安全性。

go mod tidy 是一个命令,用于更新当前 module 的依赖关系,并将依赖关系写入 go.mod 文件中。它的作用是检查 go.mod 文件中列出的依赖项,如果 go.mod 文件不够精确,则从代码中发现新的依赖项并添加它们,或者从 go.mod 中删除不再需要的依赖项。它还会将依赖项的版本锁定到最新的可用版本,以确保构建的一致性。当然,它不会自动删除没有使用的依赖项,因为有可能在未来需要使用它们。

go mod 最小版本号原则

Go module的最小版本原则指的是在依赖管理过程中,当多个依赖模块的版本号存在冲突时,Go会选择一个最低版本的模块来满足依赖关系。

具体来说,当我们在go.mod文件中声明一个依赖项时,可以指定依赖项的版本范围。例如,声明一个依赖项需要版本号在1.2.0及以上但小于2.0.0:

1
require example.com/module v1.2.0

在这种情况下,如果example.com/module的最新版本为v1.5.0,那么Go会选择一个最低版本的满足依赖关系,即v1.2.0。

Go mod的最小版本原则确保了依赖管理的稳定性和可重复性,因为它保证了我们在构建时使用的依赖项是相同的,不受最新版本的变化所影响。同时,它也提醒我们在指定依赖版本范围时,要尽可能地详细和准确,以避免不必要的依赖冲突。

假设我们有一个项目,需要使用一个第三方库**github.com/example/foo**
,我们在**go.mod**
文件中引入它:

1
2
3
4
5
module example.com/myproject

go 1.16

require github.com/example/foo v1.2.3

在**go.mod文件中,我们声明了我们需要的版本是v1.2.3,这表示我们需要v1.2.3及以上版本的库,但是我们不能使用比v1.2.3更高的版本,因为我们在go.mod文件中只指定了v1.2.3版本,如果我们想要升级到更高的版本,需要显式地修改go.mod文件,重新运行go build**命令。

假设此时**github.com/example/foo发布了一个新的版本v1.2.4,但是这个新版本引入了一个我们不需要的新特性,并且引入了一些与我们代码不兼容的改变。如果我们运行go mod tidy命令,它会自动更新我们依赖的模块的最小版本号,以便我们使用最新的版本,但它不会更新我们代码所依赖的模块的版本,以避免引入不兼容的更改。如果我们希望使用最新版本的github.com/example/foo,我们需要显式地更新go.mod文件,然后再运行go build**命令。

例如,一个项目依赖于模块A,而模块A的版本号有v1.0.0、v1.1.0、v1.2.0三个版本。如果项目所需要的A模块的最低版本为v1.1.0,那么Go会选择v1.1.0作为依赖,而不会选择更高的版本。这样能够确保项目构建时所使用的模块版本符合项目的需求。

再举个例子,A模块依赖B和C,B依赖Dv1.1.x, C依赖Dv1.2.x, 在这个例子中,B依赖的是D v1.1.x,C依赖的是D v1.2.x,而A依赖的是B和C,所以Go Module会选择一个既满足B的依赖,又满足C的依赖,且是最小版本的D版本,即D v1.2.x。因此,A最终依赖的D版本是D v1.2.x。

go.mod & go.sum 的依赖冲突

当有多个人同时修改代码并更新依赖版本时,可能会导致 go.mod 和 go.sum 文件冲突。一种常见的解决方法是使用版本控制系统(如 Git)的合并工具进行手动解决冲突。

具体步骤如下:

  1. 通过 Git 工具合并代码,并解决冲突。通常会有冲突标记提示哪些地方出现了冲突,需要手动解决。
  2. 运行 go mod tidy 命令,重新整理依赖关系,并生成新的 go.mod 和 go.sum 文件。
  3. 提交更新后的 go.mod 和 go.sum 文件到 Git 仓库中。

解决完成冲突后为什么需要再运行go mod tidy?

解决完冲突之后,可能会存在新的依赖或依赖版本的更新。如果不运行 **go mod tidy**,就可能会出现以下问题:

  • 没有将新的依赖加入到 go.mod 文件中,可能会导致构建失败;
  • 没有删除不再需要的依赖,可能会导致依赖的库数量过多,影响构建和部署的速度。

因此,我们需要再次运行 **go mod tidy**,它会自动更新 go.modgo.sum 文件,将新的依赖加入到文件中,并删除不再需要的依赖。这样就能确保依赖管理的正确性和规范性

如果在合并冲突时,你选择了更新依赖的版本,那么在运行go mod tidy后,go.mod和go.sum文件中记录的依赖版本号会更新为最新的版本,同时会删除无用的版本信息。这样就能够解决依赖冲突的问题。不过需要注意的是,更新依赖的版本也可能会引入新的问题,比如新版本存在兼容性问题或者与其他依赖包产生冲突等,需要进行适当的测试和验证。

如果你在合并冲突时选择了较旧的依赖版本并保存了更改,那么在运行 go mod tidy
后,Go 语言模块系统将根据模块的版本要求检查并更新模块的依赖项。如果发现较旧的依赖版本不满足模块的最小版本要求,那么 go mod tidy
将会更新依赖项到满足最小版本要求的版本。这可能会导致你之前选择的较旧的版本被更新为新版本,因此你需要谨慎选择依赖版本,并仔细检查在合并代码后运行 go mod tidy
是否会对依赖项版本产生不良影响。

总结:

当发生冲突时,我们需要手动解决go.mod和go.sum文件的冲突。解决冲突时需要注意以下几点:

  1. 首先需要仔细查看冲突内容,确认修改内容是否正确,决定接受哪个版本的依赖包。
  2. 在解决冲突的过程中,需要同时编辑go.mod和go.sum两个文件,确保它们的依赖关系保持一致。
  3. 解决完冲突后需要运行go mod tidy命令,以确保依赖关系的正确性。在执行go mod tidy时,会检查go.mod文件中的依赖,并将其更新到最新版本,同时还会更新go.sum文件中的对应依赖项的哈希值。
  4. 如果在解决冲突后依然出现依赖冲突,需要手动更新依赖版本或者删除多余的依赖包,并重新运行go mod tidy。

总的来说,解决go.mod和go.sum冲突需要仔细查看和理解冲突内容,并注意依赖关系的一致性,最后再运行go mod tidy以确保依赖的正确性。

go.sum文件出现冲突,是不是可以直接接受所有修改,只需要再运行go mod tidy就能重新生成go.sum

不建议直接接受所有修改。go.sum 文件是用来记录依赖模块的哈希值以及它们的版本信息,用于确保下载的模块是正确的、未被篡改的,是一份比较重要的文件。如果出现冲突,说明两个开发者在更新依赖的时候有不同的版本选择,这个时候需要仔细确认每一个修改,避免下载到错误的模块,从而导致安全问题。最好的做法是解决冲突后再次运行 go mod tidy,让 Go 自动选择最小的版本,然后确认一下依赖模块的哈希值是否正确,最后再提交修改。

配置vscode开发环境

要在VSCode中配置Go的开发环境,需要执行以下步骤:

  1. 安装Go语言环境:在官网 https://golang.org/dl/ 下载适合你的系统的安装包,安装后配置环境变量。
  2. 安装VSCode插件:打开VSCode,点击左侧的扩展图标,搜索Go插件并安装。
  3. 配置Go工具链:在VSCode中打开任意Go文件,按下 **Ctrl + Shift + P**,输入 “Go: Install/Update Tools”,选择安装你需要的工具。
  4. 配置GOPATH: 在VSCode中按下 Ctrl + , 打开设置,搜索 “go.gopath”,将其设置为你的工作空间路径或其他路径。如果没有设置GOPATH,则默认为 **$HOME/go**。
  5. 配置代码格式化:在VSCode中按下 Ctrl + , 打开设置,搜索 “editor.formatOnSave”,将其设置为 true,保存文件时将自动格式化代码。

以上是配置Go的基本步骤,你也可以通过调整其他设置来满足你的需求。

新建项目

在 Go 中,新建一个项目通常需要进行以下步骤:

  1. 首先需要创建一个项目文件夹,并在其中创建一个主文件,例如 **main.go**。
  2. 在终端中进入该项目文件夹并运行 go mod init <module> 命令,其中 <module> 是项目的模块路径。例如:
1
2
3
4
$ mkdir myproject
$ cd myproject
$ touch main.go
$ go mod init example.com/myproject
  1. main.go 文件中编写代码,可以使用任何你喜欢的文本编辑器。
  2. 运行 go build 命令来构建可执行文件,或者运行 go run main.go 直接运行程序。

这样就完成了一个简单的 Go 项目的创建。在创建项目时可以根据需要进行进一步的配置,例如使用特定的依赖管理工具、添加单元测试等。