go to index

Go程序编译出错:Load redeclared in this block

read time 2 min read
go 编译

概述

在升级 Go 版本后,编译一个 Go 模块时可能会遇到以下错误提示:

plaintext
# runtime/internal/atomic
xxx\src\runtime\internal\atomic\atomic_amd64x.go:13:6: Load redeclared in this block
xxx\src\runtime\internal\atomic\atomic_amd64x.go:19:6: Loadp redeclared in this block
    previous declaration at xxx\src\runtime\internal\atomic\atomic_amd64.go:22:32
    previous declaration at xxx\src\runtime\internal\atomic\atomic_amd64.go:28:26
xxx\src\runtime\internal\atomic\atomic_amd64x.go:30:6: Xadd redeclared in this block
    previous declaration at xxx\src\runtime\internal\atomic\atomic_amd64.go:39:37
xxx\src\runtime\internal\atomic\atomic_amd64x.go:33:6: Xadd64 redeclared in this block
    previous declaration at xxx\src\runtime\internal\atomic\atomic_amd64.go:42:39
xxx\src\runtime\internal\atomic\atomic_amd64x.go:36:6: Xadduintptr redeclared in this block
    previous declaration at xxx\src\runtime\internal\atomic\atomic_amd64.go:45:47
    previous declaration at xxx\src\runtime\internal\atomic\atomic_amd64.go:48:36
xxx\src\runtime\internal\atomic\atomic_amd64x.go:42:6: Xchg64 redeclared in this block
xxx\src\runtime\internal\atomic\atomic_amd64x.go:45:6: Xchguintptr redeclared in this block
    previous declaration at xxx\src\runtime\internal\atomic\atomic_amd64.go:54:45
xxx\src\runtime\internal\atomic\atomic_amd64x.go:48:6: And8 redeclared in this block
    previous declaration at xxx\src\runtime\internal\atomic\atomic_amd64.go:63:27
xxx\src\runtime\internal\atomic\atomic_amd64x.go:48:6: too many errors

这些错误表示某些函数或变量在同一作用域内被重复声明。

问题原因

出现这个问题的原因是因为在升级 Go 版本时直接覆盖了旧版本的文件,导致新旧版本的源码文件共存,从而引发重复声明的错误。

解决办法

方法一:删除旧的 Go 安装目录并重新安装

  1. 删除旧的 Go 安装目录

    • 找到并删除旧版本的 Go 安装目录(通常位于 /usr/local/go 或其他自定义路径)。
    bash
    sudo rm -rf /usr/local/go
    
  2. 重新安装最新版本的 Go

    bash
    wget https://go.dev/dl/go<version>.linux-amd64.tar.gz
    sudo tar -C /usr/local -xzf go<version>.linux-amd64.tar.gz
    
  3. 更新环境变量

    • 确保 PATH 环境变量包含新的 Go 安装路径。
    bash
    export PATH=$PATH:/usr/local/go/bin
    

    将上述命令添加到 ~/.bashrc~/.zshrc 文件中以确保每次登录都生效。

方法二:清理 Go 模块缓存

有时,模块缓存中的旧版本文件也可能导致冲突。可以尝试清理 Go 模块缓存:

bash
go clean -modcache