什么是 go 工作区以及如何使用它们?

2025-06-08

什么是 go 工作区以及如何使用它们?

我之前写过一篇博文,介绍过Go 1.18 版本中添加的泛型。此版本还添加了另一项改进,称为“Go 工作区”。

发行说明中关于工作区的内容如下:
发行说明中的​​工作区文档,https://tip.golang.org/doc/go1.18

在这篇博文中,我们将探讨什么是 Go 工作区以及如何使用它们。

如果您喜欢这篇博文并希望获得更多精彩的 Go 内容,请访问bytesizego.com

去修改替换

你是否曾经想过修改代码所依赖的 Go 模块?在 Google 上搜索之后,你可能会发现自己正在做类似以下的事情:

module test1.18

go 1.18

require golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect

replace golang.org/x/sync => ./local/sync
Enter fullscreen mode Exit fullscreen mode

这应该就是我们需要的全部了。为了测试,我把代码从 复制golang.org/x/sync./local/sync。我的文件树如下所示: 然后对errgroup 的函数做了一些小改动:
文件树
Go
日志行已添加到 Go func 或 errgroup

并写了一个简单的主函数:
简单的主函数调用 eg.Go

正如预期的那样,当我运行程序时,我得到以下输出:

2022/03/21 07:58:10 Let's go!
2022/03/21 07:58:10 did a thing
Enter fullscreen mode Exit fullscreen mode

太好了,一切正常!

在 Go 1.18 之前,这几乎是一次性修改多个模块的唯一方法。你需要记住在go.mod提交代码之前移除修改。

介绍工作区

有了工作区,整个过程就变得简单多了。我们可以创建一个go.work文件,其功能与之前使用的指令完全相同replace。让我们再次遵循相同的示例,但这次使用工作区文件。

我的 go.mod 文件恢复如下:

module test1.18

go 1.18

require golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect
Enter fullscreen mode Exit fullscreen mode

go.work然后,我在项目根目录下创建一个名为 的新文件,并添加以下内容:

go 1.18

use ./local/sync
Enter fullscreen mode Exit fullscreen mode

就是这样!go 工具会自动检测工作区文件并使用它。运行时,go run ./workspace/main.go我得到了和之前相同的输出:

2022/03/21 08:03:43 Let's go!
2022/03/21 08:03:43 did a thing
Enter fullscreen mode Exit fullscreen mode

在 Go 1.18 Beta 中,您可以运行:

 go build -workfile=off ./workspace/main.go
Enter fullscreen mode Exit fullscreen mode

不使用工作文件来构建代码,但这在正式版中对我来说不起作用。我在这里提出了一个针对 Go 工具的 bug ,但它似乎在正式版发布前就被移除了,真是太可惜了。

现在正确的做法是运行以下命令:

GOWORK=off go run ./workspace/main.go
Enter fullscreen mode Exit fullscreen mode

这样我们就得到了以下输出:

2022/03/21 08:27:03 did a thing
Enter fullscreen mode Exit fullscreen mode

这表明它现在正在使用我们的 go.mod 文件中的原始模块进行构建。

最佳实践和警告

社区早期的帖子建议go.work最好不要提交文件。这很合理,因为它用于本地开发,在对模块进行更改并测试后,您应该go.mod像往常一样推送、标记,然后在文件中引用它。因此,共享go.work文件是没有意义的。

考虑添加go.work到您的.gitignore

不过需要注意的是,如果您确实推送了go.work文件,运行它时似乎go build会默认使用该文件,除非您明确关闭此功能。这可能会导致生产版本意外地包含开发代码。因此,为了安全起见,go.work最好始终在生产版本中运行此功能。GOWORK=off go build ./...

包起来

希望这篇文章对你有帮助。想了解更多 Go 的趣闻,可以在这里找到我的 Twitter。

鏂囩珷鏉ユ簮锛�https://dev.to/gophers/what-are-go-workspaces-and-how-do-i-use-them-1643
PREV
10 分钟内学习 Git 基础知识
NEXT
理解 React Native 架构 执行环境 React Native 中的线程 React 和 React Native React Native 组件和 React 导航 核心组件和原生组件 React 中的思考 Hooks 和函数组件 组件副作用和闭包 引用透明性和静态类型检查 组件测试 结论