Go跨包访问全局变量练习中工作区重复模块问题解决
Go跨包全局变量练习遇到的Module重复冲突问题及解决方法
问题场景
正在进行Go创建模块并跨包访问全局变量的练习,操作流程如下:
mkdir -p goexamples/global-vars cd goexamples/global-vars touch main.go mkdir util touch util/common.go go mod init global-vars go mod tidy
生成的目录结构:
. └── global-vars ├── go.mod ├── main.go └── util └── common.go
代码文件内容
util/common.go:
package util var Mypath string // 全局变量 func init() { Mypath = "/tmp" }
main.go:
package main import ( "fmt" "global-vars/util" ) func main() { fmt.Println("The path is: " + util.Mypath) }
执行命令go run main.go时,触发错误:
go: module golang.org/x/sys appears multiple times in workspace.
环境信息
- 工作区根目录:
C:\Users\Shawn\go\vsCodeExam,该目录下同时存在go.work和go.mod - 工作区根目录
go.mod内容:
module golang.org/x/sys go 1.17
- 工作区
go.work内容:
go 1.20 use ( . ./DebuggingEx ./DebuggingEx/TestFiles ./DebuggingEx/go-debugging ./Study_Go )
- GOPATH:
C:\Users\Shawn\go
解决方法
1. 修正工作区根目录的Module命名
工作区根目录的go.mod声明了golang.org/x/sys作为模块名,这是Go官方标准库的模块名,会和系统自带模块产生冲突。将其修改为自定义命名,比如:
module vsCodeExam go 1.20
注意:模块名尽量使用自定义命名空间,避免与官方库模块重名
2. 同步并清理依赖
- 进入工作区根目录,执行
go work sync同步工作区模块依赖 - 进入练习项目目录
global-vars,重新执行go mod tidy确保依赖正确加载
3. 临时绕过工作区运行
如果暂时不想修改工作区配置,可在运行时添加参数忽略工作区文件,仅使用当前项目的go.mod:
go run -workfile=off main.go
补充说明
Go工作区的go.work会将use列表中的所有目录纳入模块范围,若其中某个目录的模块名与官方模块重名,就会触发冲突。因此工作区根目录的模块名必须使用自定义名称,避免与官方库模块重复。
内容的提问来源于stack exchange,提问作者DarkSideOfTheMoon
相关产品推荐
相关产品推荐

