将字节片转换为io.Reader


177

在我的项目中,我从请求的响应中得到了一个字节片。

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,但没有成功。


3
如果我理解正确,您希望响应为io.Reader?在这种情况下,res.Body已经属于该类型。
Arjan 2015年

3
golang.org/pkg/bytes/#NewReader将“转”一[]byteio.Reader(和io.ReadSeeker)

@Arjan yap〜body ...我想以io.reader的形式获取响应。但是当我完成请求时,在基类中,响应已被杀死..只需将响应体另存为[] byte即可。
陈·威尔森

@ ANisus我会尝试..thx花花公子..顺便说一句...看起来像是另一种类型。–
Chan Willson

@ChanWillson:这个要求更有意义,关闭后无法读取它。按照建议的用法*bytes.Reader实现io.Reader接口。
Arjan 2015年

Answers:


300

为了得到一个类型,实现io.Reader从一个[]byte切片,可以使用bytes.NewReaderbytes包:

r := bytes.NewReader(byteData)

这将返回一个bytes.Reader实现io.Reader(和io.ReadSeeker)接口的类型的值。

不用担心它们不是相同的“类型”。io.Reader是一个接口,可以用许多不同的类型实现。要了解有关Go中接口的更多信息,请阅读Effective Go:接口和类型


有类似的功能可以将a []byte变成io.Writer吗?例如bytes.NewWriter(destination)
byxor

4
@byxor是的,您正在寻找的是bytes.Buffer。在此处,您将创建一个实现io.Writer如下的缓冲区:w := bytes.NewBuffer(destination)
ANisus

我不了解来自以下错误govetcannot use *bytes.NewReader(out.Bytes()) (type bytes.Reader) as type io.Reader in argument to ioutil.NopCloser:(
Vitaly Zdanevich '19

1
@VitalyZdanevich这是因为bytes.Reader具有指针接收器,并且您将其从指针类型(*bytes.Reader)转换为基本类型(bytes.Reader)。只需删除星号(*),您就可以了:)
ANisus

-18
r := strings(byteData)

这也可以[]byte变成io.Reader


4
字符串是一个包,所以我假设是string(byteData)的意思。您可以通过这种方式从字节片中获取字符串(减去s)。字符串没有实现io.Reader接口,因为它没有Read()方法。play.golang.org/p/eRMmtHsscd是一个示例,当在字符串上调用Read()时失败。
jeffrey
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.