go 语言学习
· 阅读需 3 分钟
通俗的语言+实操代码,把 go work 和 go module 的区别、使用场景、实操步骤讲透,新手也能快速理解并上手。
go module 是 Go 1.11 引入的包管理工具,核心作用是:
go.mod 文件,标识项目的模块名、Go 版本、依赖列表;go work 是 Go 1.18 引入的多模块工作区工具,核心作用是:
go get/replace 依赖,直接引用本地模块的最新代码;| 特性 | Go Module | Go Work |
|---|---|---|
| 核心目标 | 管理单个项目的依赖 | 管理多个模块的本地开发协作 |
| 核心文件 | go.mod + go.sum | go.work(引用多个 go.mod) |
| 适用场景 | 单项目开发、生产环境依赖管理 | 多模块本地开发(如微服务、库依赖) |
| 依赖来源 | 优先从远端(proxy)拉取 | 优先使用本地模块代码 |
| 生产环境是否生效 | 是(核心依赖管理) | 否(仅本地开发用,不会提交到仓库) |
假设你有两个本地模块:
module A:github.com/yourname/project-a(业务项目);module B:github.com/yourname/project-b(A 依赖的工具库)。没有 go work 时,修改 B 的代码后,要让 A 用上最新的 B,你需要:
go.mod 里加 replace github.com/yourname/project-b => ../project-b;replace;replace,避免影响生产。有了 go work 后:
go.work 文件,声明两个模块的路径;replace;go.work 不会提交到仓库)。go version 检查);~/go-projects/ # 工作区根目录
├── project-a/ # 业务模块(依赖 project-b)
│ ├── go.mod
│ └── main.go
└── project-b/ # 工具库模块
├── go.mod
└── utils.go
# 进入 project-b 目录
cd ~/go-projects/project-b
# 初始化模块(模块名自定义,建议用仓库路径)
go mod init github.com/yourname/project-b
创建 utils.go(工具库代码):
package projectb
// 工具函数:返回字符串
func Hello() string {
return "Hello from project-b!"
}
# 进入 project-a 目录
cd ~/go-projects/project-a
# 初始化模块
go mod init github.com/yourname/project-a
# 引入 project-b(此时拉取的是远端版本,后续用 go work 替换为本地)
go get github.com/yourname/project-b
创建 main.go(业务代码):
package main
import (
"fmt"
"github.com/yourname/project-b"
)
func main() {
// 调用 project-b 的函数
fmt.Println(projectb.Hello())
}
# 回到工作区根目录
cd ~/go-projects
# 初始化工作区(生成 go.work 文件)
go work init ./project-a ./project-b
执行后,根目录会生成 go.work 文件,内容如下:
go 1.22 # Go 版本
# 引用的本地模块路径
use (
./project-a
./project-b
)
# 在工作区根目录执行 project-a 的代码
go run ./project-a
# 输出:Hello from project-b!
# 修改 project-b 的 Hello 函数(比如返回 "Hello from local project-b!")
# 再次执行,直接生效(无需 go get/replace)
go run ./project-a
# 输出:Hello from local project-b!
| 命令 | 作用 |
|---|---|
go work init [模块路径] | 初始化工作区,添加指定模块 |
go work use [模块路径] | 给工作区添加新模块(多个路径用空格分隔) |
go work edit | 编辑 go.work 文件(如手动添加 replace) |
go work sync | 将工作区的依赖同步到各模块的 go.mod |
go work env | 查看工作区的环境变量 |