在我的项目中,我有一个来自请求响应的字节切片。
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
log.Println("StatusCode为" + strconv.Itoa(resp.StatusCode))
return
}
respByte, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Println("fail to read response data")
return
}
这可行,但如果我想获取 io.Reader
的响应正文,我该如何转换?我尝试了 newreader/writer 但没有成功。
io.Reader
?在那种情况下, resp.Body 已经是那种类型。
io.Reader
接口的 *bytes.Reader
。
要从 []byte
切片获取实现 io.Reader
的类型,您可以使用 bytes
包中的 bytes.NewReader
:
r := bytes.NewReader(byteData)
这将返回实现 io.Reader
(和 io.ReadSeeker
)接口的 bytes.Reader
类型的值。
不要担心它们不是同一个“类型”。 io.Reader
是一个接口,可以由许多不同的类型实现。要详细了解 Go 中的接口,请阅读 Effective Go: Interfaces and Types。
[]byte
变成io.Writer
?例如bytes.NewWriter(destination)
bytes.Buffer
。在那里,您创建一个像这样实现io.Writer
的缓冲区:w := bytes.NewBuffer(destination)
。govet
的这个错误:cannot use *bytes.NewReader(out.Bytes()) (type bytes.Reader) as type io.Reader in argument to ioutil.NopCloser
:(bytes.Reader
具有指针接收器,并且您正在将其从指针类型 (*bytes.Reader
) 转换为基本类型 (bytes.Reader
) 。去掉星号 (*
) 就可以了:)