Go安装&环境配置
Go 安装&环境配置
安装
- https://go.dev/dl/ 进入go官网,下载自己系统对应的安装包
安装完成后在终端输入go version 确认是否安装成功
相关配置
GOPATH配置
GOPATH
是 Go 语言中的一个环境变量,它指向一个工作空间(Workspace)目录,包含了许多 Go 项目和它们的相关源代码、二进制文件和第三方依赖包等内容。同时,该目录也是 Go 工具链(如 go、go build、go install)默认搜索的目录。
通常情况下,我们在设置 GOPATH 时会将其设置为一个目录,例如:**/Users/username/go
,并在该目录下创建三个子目录:src
、pkg
** 和 **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文件的主要作用如下:
- 管理模块的依赖关系,列出所依赖的其他模块,并指定它们的版本信息。
- 确定模块的名称和版本号,并指定它们在引用时的别名。
- 记录当前使用的Go版本,并指定需要的最低版本。
下面是一个简单的go.mod文件示例:
1 | module github.com/example/mymodule |
其中:
- 第一行指定模块的名称和导入路径。
- 第二行指定使用的Go版本。
- require块列出所依赖的其他模块和版本信息。
当我们使用go命令进行构建或下载依赖时,go.mod文件会被自动更新以反映当前的依赖关系。同时,go.mod文件也可以手动编辑来管理依赖和版本信息。
在 go.mod
文件中,每个模块都用 module
关键字和模块路径来定义,例如:
1 | module example.com/mymodule |
然后可以使用 require
关键字来指定依赖的模块及其版本,例如:
1 | require ( |
这表示当前模块依赖于 example.com/mymodule2
版本为 v1.0.0
和 example.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 | module example.com/myproject |
在**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)的合并工具进行手动解决冲突。
具体步骤如下:
- 通过 Git 工具合并代码,并解决冲突。通常会有冲突标记提示哪些地方出现了冲突,需要手动解决。
- 运行
go mod tidy
命令,重新整理依赖关系,并生成新的 go.mod 和 go.sum 文件。 - 提交更新后的 go.mod 和 go.sum 文件到 Git 仓库中。
解决完成冲突后为什么需要再运行go mod tidy?
解决完冲突之后,可能会存在新的依赖或依赖版本的更新。如果不运行 **
go mod tidy
**,就可能会出现以下问题:
- 没有将新的依赖加入到
go.mod
文件中,可能会导致构建失败;- 没有删除不再需要的依赖,可能会导致依赖的库数量过多,影响构建和部署的速度。
因此,我们需要再次运行 **
go mod tidy
**,它会自动更新go.mod
和go.sum
文件,将新的依赖加入到文件中,并删除不再需要的依赖。这样就能确保依赖管理的正确性和规范性
如果在合并冲突时,你选择了更新依赖的版本,那么在运行go mod tidy后,go.mod和go.sum文件中记录的依赖版本号会更新为最新的版本,同时会删除无用的版本信息。这样就能够解决依赖冲突的问题。不过需要注意的是,更新依赖的版本也可能会引入新的问题,比如新版本存在兼容性问题或者与其他依赖包产生冲突等,需要进行适当的测试和验证。
如果你在合并冲突时选择了较旧的依赖版本并保存了更改,那么在运行 go mod tidy
后,Go 语言模块系统将根据模块的版本要求检查并更新模块的依赖项。如果发现较旧的依赖版本不满足模块的最小版本要求,那么 go mod tidy
将会更新依赖项到满足最小版本要求的版本。这可能会导致你之前选择的较旧的版本被更新为新版本,因此你需要谨慎选择依赖版本,并仔细检查在合并代码后运行 go mod tidy
是否会对依赖项版本产生不良影响。
总结:
当发生冲突时,我们需要手动解决go.mod和go.sum文件的冲突。解决冲突时需要注意以下几点:
- 首先需要仔细查看冲突内容,确认修改内容是否正确,决定接受哪个版本的依赖包。
- 在解决冲突的过程中,需要同时编辑go.mod和go.sum两个文件,确保它们的依赖关系保持一致。
- 解决完冲突后需要运行go mod tidy命令,以确保依赖关系的正确性。在执行go mod tidy时,会检查go.mod文件中的依赖,并将其更新到最新版本,同时还会更新go.sum文件中的对应依赖项的哈希值。
- 如果在解决冲突后依然出现依赖冲突,需要手动更新依赖版本或者删除多余的依赖包,并重新运行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的开发环境,需要执行以下步骤:
- 安装Go语言环境:在官网 https://golang.org/dl/ 下载适合你的系统的安装包,安装后配置环境变量。
- 安装VSCode插件:打开VSCode,点击左侧的扩展图标,搜索Go插件并安装。
- 配置Go工具链:在VSCode中打开任意Go文件,按下 **
Ctrl + Shift + P
**,输入 “Go: Install/Update Tools”,选择安装你需要的工具。 - 配置GOPATH: 在VSCode中按下
Ctrl + ,
打开设置,搜索 “go.gopath”,将其设置为你的工作空间路径或其他路径。如果没有设置GOPATH,则默认为 **$HOME/go
**。 - 配置代码格式化:在VSCode中按下
Ctrl + ,
打开设置,搜索 “editor.formatOnSave”,将其设置为 true,保存文件时将自动格式化代码。
以上是配置Go的基本步骤,你也可以通过调整其他设置来满足你的需求。
新建项目
在 Go 中,新建一个项目通常需要进行以下步骤:
- 首先需要创建一个项目文件夹,并在其中创建一个主文件,例如 **
main.go
**。 - 在终端中进入该项目文件夹并运行
go mod init <module>
命令,其中<module>
是项目的模块路径。例如:
1 | $ mkdir myproject |
- 在
main.go
文件中编写代码,可以使用任何你喜欢的文本编辑器。 - 运行
go build
命令来构建可执行文件,或者运行go run main.go
直接运行程序。
这样就完成了一个简单的 Go 项目的创建。在创建项目时可以根据需要进行进一步的配置,例如使用特定的依赖管理工具、添加单元测试等。