ChatGPT解决这个技术问题 Extra ChatGPT

将字节切片转换为 io.Reader

go

在我的项目中,我有一个来自请求响应的字节切片。

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 已经是那种类型。
golang.org/pkg/bytes/#NewReader 会将 []byte “转换”为 io.Reader(和 io.ReadSeeker)
@Arjan yap~body ...我想将响应作为 io.reader 获取。但是在基类中,当我完成请求时,响应已被杀死..只需将响应主体保存为结构中的 []byte 即可。
@ANisus 我会尝试..谢谢老兄..顺便说一下...它看起来像不同的类型..
@ChanWillson:这个要求更有意义,关闭后无法读取正文。按照建议使用实现 io.Reader 接口的 *bytes.Reader

P
Pang

要从 []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)
@byxor 是的,您要查找的是 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 :(
@VitalyZdanevich 那是因为 bytes.Reader 具有指针接收器,并且您正在将其从指针类型 (*bytes.Reader) 转换为基本类型 (bytes.Reader) 。去掉星号 (*) 就可以了:)

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅