Golang的http2模块要求使用Go 1.17版本

Golang的http2模块要求使用Go 1.17版本 我在构建项目源码时遇到以下错误。我已将Go版本从1.18降级到1.17,但问题依然存在。有人能帮我解决这个问题吗?

错误日志:

golang.org/x/net/http2

../../../pkg/mod/golang.org/x/net@v0.0.0-20211112202133-69e39bad7dc2/http2/transport.go:417:45: undefined: os.ErrDeadlineExceeded
note: module requires Go 1.17

Go版本:

go version go1.17.8 linux/amd64

更多关于Golang的http2模块要求使用Go 1.17版本的实战教程也可以访问 https://www.itying.com/category-94-b0.html

6 回复

我不太熟悉Yocto和Bitbake,但由于它使用了一个独立的Linux环境,并且Bitbake是基于它的,也许在某个构建阶段存在错误。你能发布详细的堆栈信息吗?使用 go build -x

更多关于Golang的http2模块要求使用Go 1.17版本的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


根据我的经验,子仓库 - Go 包套件仅支持最新的两个主要 Go 版本。尝试将 Go 升级到 1.20 或至少 1.19(如果你确实因某些原因需要,例如远程平台要求)。在 90% 的情况下,降级都不是一个好主意,除非是绝对必要。

感谢提供的信息。我原本使用的是最新版本的 Go。为了定位问题,我刚刚降级并进行了检查。我是在 Yocto 环境中使用 Go。当我单独构建这些包时,它们都能正确构建。但通过 Yocto 的 bitbake 构建时,却出现了“模块需要 Go 1.17”和“模块需要 Go 1.18”这样的提示。有什么建议吗?

vediyappan@LX-9N9H9R2:~$ go version
go version go1.19.6 linux/amd64

所以,你的意思是:

  • 逐步构建包是可行的(对于 x/net 包也适用吗?)
  • 一起构建所有包会出现 module 1.17/8 required 错误
  • 构建 sys/unix 包很顺利,所以问题不在于你的 Go 套件与底层系统之间的接口(我想这是一个自定义的 yocto 实例,对吧?一个自定义的 Linux 系统…) 因此,我唯一能说的是,你的 .bb 文件有问题,或者缺少一个命令来在你的完整构建进行时正确连接各个模块。 然而,我的意思是,也请发布完整的构建步骤分析以及详细的错误信息,以便找到它失败的确切步骤

我尝试使用“go install”更新外部包,使用“go get”更新内部包到最新版本。但这种方法也没有解决问题。

vediyappan@LX-9N9H9R2:~/work/yoctoproject/build$ go install github.com/edgexfoundry/go-mod-messaging/v3/internal/pkg/mqtt@latest
go: downloading github.com/edgexfoundry/go-mod-messaging v0.1.30
go: downloading github.com/edgexfoundry/go-mod-messaging/v3 v3.0.0-dev.14
go: downloading golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
package github.com/edgexfoundry/go-mod-messaging/v3/internal/pkg/mqtt is not a main package
vediyappan@LX-9N9H9R2:~/work/yoctoproject/build$
vediyappan@LX-9N9H9R2:~/work/yoctoproject/build$ go get golang.org/x/sys/unix
go: downloading golang.org/x/sys v0.6.0
go: added golang.org/x/sys v0.6.0
vediyappan@LX-9N9H9R2:~/work/yoctoproject/build$ go version
go version go1.19.6 linux/amd64

这个错误是因为你使用的 golang.org/x/net/http2 模块版本需要 Go 1.17 或更高版本,但 os.ErrDeadlineExceeded 这个变量是在 Go 1.17 中才引入的。虽然你降级到了 Go 1.17.8,但可能还存在模块版本不匹配的问题。

检查你的 go.mod 文件中 golang.org/x/net 的版本。错误日志显示你正在使用 v0.0.0-20211112202133-69e39bad7dc2 这个版本,它发布于 2021 年 11 月,当时 Go 1.17 已经发布。

解决方案:

  1. 清理模块缓存并更新依赖:
go clean -modcache
go mod tidy
  1. 如果问题仍然存在,尝试升级 golang.org/x/net 到更新的版本:
go get golang.org/x/net@latest
  1. 或者指定一个兼容的版本:
go get golang.org/x/net@v0.0.0-20211209124913-491a49abca63
  1. 验证 Go 环境:
go env GOVERSION
go version

示例 go.mod 更新后的变化:

module your-project

go 1.17

require (
    golang.org/x/net v0.0.0-20211209124913-491a49abca63
)

执行 go mod tidy 后重新构建项目应该能解决这个问题。

回到顶部