介绍
在本实验中,我们将学习 Go 语言中两种不同的依赖管理方式:GOPATH 和 Go Modules。这些是有效组织和管理 Go 项目的核心概念。
知识点:
- GOPATH
- GOROOT
- Go Modules
准备工作
在这一步中,我们将通过解压提供的压缩包来准备实验环境。
首先,打开终端并输入以下命令进入项目目录:
cd ~/project在当前目录下解压
helloWorld.tar.gz文件:tar -xzf helloWorld.tar.gz文件解压后,检查
helloWorld文件夹是否已成功创建:ls helloWorld
如果解压正确,该命令将列出 helloWorld 目录的内容。
基础模式 GOPATH
在 Go 1.11 版本之前,Go 使用一个名为 GOPATH 的特定工作区来存储所有的 Go 代码。在这一步中,我们将了解 GOPATH 的工作原理。
GOROOT是 Go 的安装目录,其中包含 Go 工具链和标准库包。GOPATH是你存放个人 Go 代码的地方,它包含三个子目录:- src:存储项目的源代码。
- bin:存储编译后的可执行文件。
- pkg:存储编译后的非可执行包文件。
要检查当前的 GOPATH 和 GOROOT 设置,请运行以下命令:
## 查看 GOPATH 目录
go env | grep GOPATH
## 查看 GOROOT 目录
go env | grep GOROOT
这些命令将显示你机器上配置的 GOPATH 和 GOROOT 路径。
初始化模块
Go Modules 在 Go 1.11 中引入,并在 Go 1.13 中默认启用,旨在解决两个主要问题:
- 对 GOPATH 的过度依赖:在 Go Modules 出现之前,代码必须存储在
GOPATH/src目录下。有了 Go Modules,你可以将代码存储在系统中的任何位置。 - 版本依赖问题:Go Modules 允许项目管理和跟踪特定版本的依赖项,使得处理同一个包的不同版本变得更加容易。
在这一步中,我们将为一个新项目初始化 Go Module。
为项目创建一个名为
testHello的新目录:cd ~/project mkdir testHello进入
testHello目录:cd testHello为该项目初始化 Go Module:
go mod init testHello输出结果应为:
go: creating new go.mod: module testHello在
testHello文件夹内创建一个名为testHello.go的新 Go 文件,内容如下:touch testHello.gopackage main import "fmt" func main() { fmt.Println("hello, world") }
现在,我们已经使用 Go Modules 初始化了 testHello 项目,并添加了一个简单的 Go 程序。
使用模块导入其他包
在这一步中,我们将演示如何在 Go 项目中导入和使用其他模块。
helloWorld 文件夹中的 helloWorld 包已经通过 Go Modules 进行了初始化。同样,test 包也使用了 Go Modules,并从 helloWorld 包中导入了 Say 函数。
为了探索这一点,请运行以下命令:
首先,查看
helloWorld和test目录的结构:helloWorld ├── go.mod └── helloWorld.go test ├── go.mod └── test.go接下来,打开
test/go.mod文件。你应该会看到以下内容:module test go 1.15 require "helloWorld" v0.0.1 replace "helloWorld" => "../helloWorld"
replace 指令告诉 Go 使用本地路径 ../helloWorld,而不是从外部仓库获取。require 指令指定了 test 包依赖于 helloWorld 包的 v0.0.1 版本。
| 参数 | 描述 |
|---|---|
| module | 指定当前包名 |
| require | 指定依赖项 |
| replace | 替换依赖项路径 |
| exclude | 排除依赖项 |
运行 test 包中的 test.go 文件:
cd ~/project/test
go run test.go
输出结果应为:
hello, world
导入远程包
在 Go 中,你可以轻松地导入远程包。让我们通过使用 GitHub 上的远程包来演示这一点。
创建一个目录
remoteModule:cd ~/project mkdir remoteModule cd remoteModule初始化 Go Module:
go mod init remoteModule在
remoteModule文件夹内创建一个remote.go文件,内容如下:touch remote.gopackage main import ( "github.com/labex-labs/golang-dev-code/chap02module" ) func main() { chap02module.StringTobase64("miiy") }该程序从 GitHub 导入了
chap02module包,并使用了其中的StringTobase64函数。使用以下命令运行
remote.go文件:go get github.com/labex-labs/golang-dev-code/chap02module go run -v remote.go提示:免费用户无法访问互联网,因此无法运行此命令。升级到 Pro 计划以获得互联网访问权限。
go get 命令会从 GitHub 下载 chap02module 包并将其存放在模块缓存中。完成后,go run 命令将执行你的程序。
小测试
在这一步中,我们将通过创建一个使用远程模块中 Hello 函数的新文件来检验所学知识。
创建一个文件夹
remoteModule2:cd ~/project mkdir remoteModule2 cd remoteModule2初始化 Go Module:
go mod init remoteModule2创建一个
remote2.go文件,内容如下:touch remote2.gopackage main import ( "github.com/labex-labs/golang-dev-code/chap02module" ) func main() { chap02module.Hello() }运行程序:
go get github.com/labex-labs/golang-dev-code/chap02module go run remote2.go输出结果应为:
hello
总结
在本实验中,我们学习了以下内容:
GOPATH和GOROOT目录的含义和用途。- 使用 Go Modules 管理依赖的基础知识。
- 如何在项目中初始化和使用 Go Modules。
- 如何导入和使用本地及远程 Go 包。
完成本实验后,你应该能够熟练地使用 Go Modules 来管理 Go 项目中的依赖关系。



