В моем проекте у меня есть кусочек байта из ответа на запрос.
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
, как мне конвертировать? Я попробовал новый читатель / писатель, но не увенчался успехом.
io.Reader
? В этом случае, респ. Боди уже относится к этому типу.[]byte
в aio.Reader
(и io.ReadSeeker)*bytes.Reader
который реализуетio.Reader
интерфейс.Ответы:
Чтобы получить тип, который реализуется
io.Reader
из[]byte
среза, вы можете использоватьbytes.NewReader
вbytes
пакете:Это вернет значение типа,
bytes.Reader
которое реализует интерфейсio.Reader
(иio.ReadSeeker
).Не беспокойтесь о том, что они не одного и того же типа.
io.Reader
является интерфейсом и может быть реализовано многими различными типами. Чтобы узнать немного больше об интерфейсах в Go, прочитайте Effective Go: Интерфейсы и типы .источник
[]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
). Просто избавьтесь от звездочки (*
) и у вас все будет хорошо :)Это также работает, чтобы превратить
[]byte
вio.Reader
источник