升级Go版本后编译出错:Load redeclared in this block

本文讲述了作者在升级Go语言版本过程中遇到的编译错误,通过排查发现是旧版本和新版本源码冲突,最终建议彻底删除旧版本并重新安装。

今天打算把Go升级到1.14.2,升级的方法就两步,

先上Go官方下载页面( https://golang.org/dl/ )下载macos对应的二进制包(1.14.13地址 https://studygolang.com/dl/golang/go1.14.13.linux-amd64.tar.gz )

https://studygolang.com/dl/golang/go1.14.13.linux-amd64.tar.gz

下载好后把压缩包解压到相应的目录:

tar -C /usr/local -xzf go1.14.13.linux-amd64.tar.gz

因为是升级,不是初次安装,之前已经把PATH设置好了,就不用管了。

之后执行以下命令,查看Go版本:

# go version
go version go1.14.13 linux/amd64

看到已经是1.14.13了,美滋滋。

但是用Go编译自己的程序,输出一大段如下错误:

# runtime/internal/atomic
/usr/local/go/src/runtime/internal/atomic/atomic_amd64x.go:18:6: Load redeclared in this block
	previous declaration at /usr/local/go/src/runtime/internal/atomic/atomic_amd64.go:16:24
/usr/local/go/src/runtime/internal/atomic/atomic_amd64x.go:24:6: Loadp redeclared in this block
	previous declaration at /usr/local/go/src/runtime/internal/atomic/atomic_amd64.go:22:32
/usr/local/go/src/runtime/internal
Go 语言中,编译错误 `main redeclared in this block` 表示在同一个包(package)中存在多个 `main` 函数定义。Go 语言要求每个包中只能有一个 `main` 函数作为程序的入口点,尤其是在 `main` 包中。如果多个 `.go` 文件都定义了 `main` 函数,则会导致编译冲突[^1]。 具体到错误信息中: - `.\awesomeproject.go:10:6` 表示 `awesomeproject.go` 文件的第 10 行第 6 列定义了一个 `main` 函数。 - `.\111.go:5:6` 表示 `111.go` 文件的第 5 行第 6 列也定义了一个 `main` 函数。 ### 解决方案 1. **确认包结构和主函数位置** 检查所有 `.go` 文件的包声明(`package main`),确保只有一个文件保留 `main` 函数。其他包含 `main` 函数的文件应将其删除或重命名。 2. **使用 `_test.go` 文件进行测试** 如果某些文件是用于测试的,建议将其命名为以 `_test.go` 结尾。Go 测试工具会自动识别这些文件并避免冲突[^1]。 3. **组织代码结构** 将非主函数代码移动到其他包中。例如,将部分逻辑放入 `utils` 包或其他模块中,避免在 `main` 包中重复定义入口函数。 4. **清理编译缓存** 有时旧的编译缓存可能导致问题。使用以下命令清理缓存并重新编译: ```bash go clean go build ``` 5. **使用 `go vet` 工具检查** 运行 `go vet` 可以帮助发现潜在的重复定义问题: ```bash go vet ``` ### 示例代码结构 假设项目结构如下: ``` project/ ├── awesomeproject.go └── 111.go ``` - **awesomeproject.go** ```go package main import "fmt" func main() { fmt.Println("This is the correct main function.") } ``` - **111.go** ```go package main func main() { // This will cause a redeclaration error // ... } ``` 为解决此问题,需将 `111.go` 中的 `main` 函数删除或重命名为其他函数,例如: ```go package main func testFunction() { // ... } ``` ### 注意事项 - Go 语言要求每个包只能有一个 `main` 函数,且该函数必须位于 `main` 包中。 - 在团队协作或大型项目中,建议使用明确的目录结构和包命名规范,以避免重复定义问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杰哥的技术杂货铺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值