Go 1.14.2项目突发‘redeclared in this block’错误求助
问题分析与临时解决方案
问题原因
你的项目没有go.mod文件,Go会自动拉取依赖的最新版本。而最新版的golang.org/x/net已不再适配Go 1.14这类旧版本,其context目录下的条件编译标签(build tags)配置出现问题,导致go17.go和pre_go17.go在Go 1.14环境下同时被编译——两个文件中都声明了todo变量,最终触发“redeclared in this block”错误。
临时解决方案
方案1:锁定兼容旧Go版本的x/net依赖
在GitLab Runner的构建步骤中,添加以下命令强制拉取支持Go 1.14的旧版golang.org/x/net:
# 拉取最后一批支持Go 1.14的版本之一 go get golang.org/x/net@v0.0.0-20220722155237-a158d28d115b
如果拉取失败,可手动克隆指定版本:
rm -rf $GOPATH/src/golang.org/x/net git clone https://github.com/golang/net.git $GOPATH/src/golang.org/x/net cd $GOPATH/src/golang.org/x/net git checkout v0.0.0-20220722155237-a158d28d115b
方案2:修复条件编译标签
通过修改pre_go17.go的build tag,让它只在Go 1.6及以下版本编译,避免和go17.go冲突:
sed -i 's/\/\/ +build .*/\/\/ +build !go1.7/' $GOPATH/src/golang.org/x/net/context/pre_go17.go
执行此命令后再进行项目构建即可。
方案3:替换为标准库context
Go 1.14标准库已内置context包,检查项目间接依赖是否可以替换为使用标准库context的版本,或直接修改代码将import "golang.org/x/net/context"替换为import "context"。
内容的提问来源于stack exchange,提问作者karansardana
相关产品推荐
相关产品推荐

