英文:
ReadAll not declared by package iocompiler - Golang
问题
我在我的项目中使用Golang。
代码如下:
import (
"bytes"
"context"
"encoding/json"
"fmt"
"io"
"net/http"
"sync"
"time"
)
...
if response.StatusCode != 200 {
respBdy, _ := io.ReadAll(response.Body)
return fmt.Errorf("%v response from client: %v", response.StatusCode, respBdy)
}
当我使用make run
运行项目时,我遇到了以下错误:
go-tools@v0.0.0-20220528203058-9108e3643722/messengers/client.go:133:17: undefined: io.ReadAll
经过调试,我可以理解问题是ReadAll
未在io
包中声明。
有什么办法可以解决这个问题吗?
编辑:我使用的Go版本是:
go version
go version go1.15.6 darwin/amd64
英文:
I am using golang in my project.
The code is as follows
import (
"bytes"
"context"
"encoding/json"
"fmt"
"io"
"net/http"
"sync"
"time"
)
....
if response.StatusCode != 200 {
respBdy, _ := io.ReadAll(response.Body)
return fmt.Errorf("%v response from client: %v", response.StatusCode, respBdy)
}
When i run the project using make run
, i am getting the following error
go-tools@v0.0.0-20220528203058-9108e3643722/messengers/client.go:133:17: undefined: io.ReadAll
On debugging, i can understand the problem is ReadAll not declared by package iocompiler
Any idea on how to fix this?
Edit: The go version i am using is
go version
go version go1.15.6 darwin/amd64
答案1
得分: 0
根据Manjeet和Emile的说法,在go1.16
版本发布后,io/ioutil中的函数被移动到io包中。
Discard => io.Discard
NopCloser => io.NopCloser
ReadAll => io.ReadAll
ReadDir => os.ReadDir
ReadFile => os.ReadFile
TempDir => os.MkdirTemp
TempFile => os.CreateTemp
WriteFile => os.WriteFile
链接发布说明以供参考go1.16
。
关于go版本不匹配的问题:go.mod
中是go1.13
,终端中是go1.15
,go.mod
中的go版本是根据使用go mod init [module-path]
初始化时的版本添加的。go mod init的GoDoc页面并没有解答你的疑问,但附上供参考。
换句话说,go.mod
并不表示你的本地go版本。相反,它提供了让你的项目(作为模块)无缝运行所需的最低go版本和导入包的版本。
我找到了一个旧项目的示例,将尝试对其进行解释。
module project-name
go 1.14
require (
github.com/go-redis/redis/v7 v7.4.0
github.com/stretchr/testify v1.6.1
github.com/vektra/mockery v1.1.2 // indirect
)
这意味着该项目需要go1.14
,以及至少需要redis@v7.4.0
,testify@v1.6.1
和mockery@v1.1.2
。低于这些版本的可能仍然可以工作,但不建议这样做。高于这些版本预计会更好,但可能会更改名称或包名,就像上面的示例一样。更多详细信息请参阅gomod-ref。
还有一点信息:io
和io/util
是Go的标准库的一部分。这意味着要使用io.ReadAll
这样的函数,您需要更高版本的标准库,因此需要更高版本的Go(至少是1.16
)。
**结论:**您仍然可以在
go.mod
中保留go1.13
。只需升级本地的go版本。如果其他开发人员也愿意让您在go.mod
中升级,那就这样做吧!
**意见:**我个人建议目前使用go1.17
的最新版本,直到所有外部包都实现了go1.18
和generics
。
英文:
As Manjeet and Emile stated, starting from go1.16
's release, the functions from io/ioutil are moved to io package.
Discard => io.Discard
NopCloser => io.NopCloser
ReadAll => io.ReadAll
ReadDir => os.ReadDir
ReadFile => os.ReadFile
TempDir => os.MkdirTemp
TempFile => os.CreateTemp
WriteFile => os.WriteFile
Linking release notes of go1.16
for reference.
About the mismatch of go versions: go1.13
in go.mod
and go1.15
in terminal, the go version in go.mod
gets added depending on the version when it was initialised using go mod init [module-path]
. GoDoc page for go mod init doesn't clear your doubt but attaching for ref.
In other words, the go.mod
doesn't denote your local go version. Rather, it gives the minimal go version and imported package's versions that will let your project (as module) run hassle-free.
I found a sample from an old project. Will try to explain on it.
module project-name
go 1.14
require (
github.com/go-redis/redis/v7 v7.4.0
github.com/stretchr/testify v1.6.1
github.com/vektra/mockery v1.1.2 // indirect
)
This means the project requires go1.14
, along with redis@v7.4.0
, testify@v1.6.1
and mockery@v1.1.2
at the very least. Lower than these versions "might" still work. Not recommended. Higher than those versions are expected to be better, but there is a possibility of change of names or package name like above. More details at gomod-ref.
Just another bit of info: the io
and io/util
are part of Go's standard library. This means that in order to use the function as io.ReadAll
, you would need higher version of standard library, and so, higher version of Go (1.16
at least).
> Conclusion: You can still keep go1.13
in go.mod
. Just upgrade the go version in local. And if other devs are kind enough to let you upgrade in go.mod
too, do it!
Opinion: I personally recommend go1.17
's latest for now until all external packages implement go1.18
and generics
.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论