从 Go 1.13 升级后使用 Go 1.14 构建时,是什么导致了有关“先前声明于”的运行时内部错误?

And*_*ini 16 go

将我的go安装文件夹升级到Go 1.14

sudo tar -C /usr/local -xzf go1.14.linux-amd64.tar.gz
Run Code Online (Sandbox Code Playgroud)

每次尝试构建程序时,我都会收到运行时错误:

~/playground/go/src/hello ? go build hello
# 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/atomic/atomic_amd64x.go:30:6: Load64 redeclared in this block
    previous declaration at /usr/local/go/src/runtime/internal/atomic/atomic_amd64.go:28:26
/usr/local/go/src/runtime/internal/atomic/atomic_amd64x.go:36:6: LoadAcq redeclared in this block
    previous declaration at /usr/local/go/src/runtime/internal/atomic/atomic_amd64.go:34:27
/usr/local/go/src/runtime/internal/atomic/atomic_amd64x.go:41:6: Xadd redeclared in this block
    previous declaration at /usr/local/go/src/runtime/internal/atomic/atomic_amd64.go:39:37
/usr/local/go/src/runtime/internal/atomic/atomic_amd64x.go:44:6: Xadd64 redeclared in this block
    previous declaration at /usr/local/go/src/runtime/internal/atomic/atomic_amd64.go:42:39
/usr/local/go/src/runtime/internal/atomic/atomic_amd64x.go:47:6: Xadduintptr redeclared in this block
    previous declaration at /usr/local/go/src/runtime/internal/atomic/atomic_amd64.go:45:47
/usr/local/go/src/runtime/internal/atomic/atomic_amd64x.go:50:6: Xchg redeclared in this block
    previous declaration at /usr/local/go/src/runtime/internal/atomic/atomic_amd64.go:48:36
/usr/local/go/src/runtime/internal/atomic/atomic_amd64x.go:53:6: Xchg64 redeclared in this block
    previous declaration at /usr/local/go/src/runtime/internal/atomic/atomic_amd64.go:51:38
/usr/local/go/src/runtime/internal/atomic/atomic_amd64x.go:56:6: Xchguintptr redeclared in this block
    previous declaration at /usr/local/go/src/runtime/internal/atomic/atomic_amd64.go:54:45
/usr/local/go/src/runtime/internal/atomic/atomic_amd64x.go:56:6: too many errors
Run Code Online (Sandbox Code Playgroud)

我试图降级到的版本1.13.8buildrun去罚款。

sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.13.8.linux-amd64.tar.gz

~ ? go version
go version go1.13.8 linux/amd64

~/go ? go build hello && go run hello
hello, world
Run Code Online (Sandbox Code Playgroud)

我的操作系统是 Linux Mint 19.2。

And*_*ini 50

当目标目录已用于较旧的Go安装并且某些文件已重命名(与以前的版本相比)时,会出现此错误。

例如:

围棋1.13.8文件go/src/runtime/internal/atomic/atomic_amd64x.go已被移动到go/src/runtime/internal/atomic/atomic_amd64.go围棋1.14

在不清理目标目录的情况下提取会触发“先前声明”错误,因为func Xchguintptrgo/src/runtime/internal/atomic/atomic_amd64x.gogo/src/runtime/internal/atomic/atomic_amd64.go

为避免此类错误,请删除安装文件夹 ( /usr/local/go ) 并重新安装Go 1.14

sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.14.linux-amd64.tar.gz
Run Code Online (Sandbox Code Playgroud)

再次测试:

~/go/src/hello ? go version
go version go1.14 linux/amd64
~/go/src/hello ? go build hello && go run hello
hello, world
Run Code Online (Sandbox Code Playgroud)

  • 我之前也发现过这个问题。如果您只是在现有的 /use/local/go 设置之上解压 go1.14 存档,就会出现这种情况。有些文件被重命名,因此您会在同一个 GOROOT 目录中同时获得旧文件和新的 1.14 文件,这会造成混乱。如果您确保在解压之前删除 /usr/local/go 内容,则可以避免这种情况。请考虑更新您的答案,以在最后包含对导致问题的原因的解释。 (5认同)
  • 这有帮助。我今天在 Windows 10 上安装 Go 1.15,似乎仍然有以前的 Go 版本的遗留问题。我删除了 C:/Go 文件夹并再次运行 1.15 安装程序 - 之后问题得到解决。 (2认同)