Конвертировать срез байтов в io.Reader

179

В моем проекте у меня есть кусочек байта из ответа на запрос.

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, как мне конвертировать? Я попробовал новый читатель / писатель, но не увенчался успехом.

Чан Уилсон
источник
3
Если я правильно понимаю, вы хотите ответ как io.Reader? В этом случае, респ. Боди уже относится к этому типу.
Арджан
3
golang.org/pkg/bytes/#NewReader «превратит» a []byteв a io.Reader(и io.ReadSeeker)
ANisus,
@Arjan yap ~ body ... я хочу получить ответ в виде io.reader. Но в базовом классе, когда я закончу запрос, ответ был убит ... просто сохраните тело ответа в виде байта [] в структуре.
Чен Уилсон,
@ ANisus я попробую .... спасибо чувак .. кстати ... это похоже на другой тип ..
Чен Уилсон
@ChanWillson: Это требование имеет больше смысла, тело не может быть прочитано после его закрытия. Как предлагается использовать, *bytes.Readerкоторый реализует io.Readerинтерфейс.
Арджан

Ответы:

308

Чтобы получить тип, который реализуется io.Readerиз []byteсреза, вы можете использовать bytes.NewReaderв bytesпакете:

r := bytes.NewReader(byteData)

Это вернет значение типа, bytes.Readerкоторое реализует интерфейс io.Readerio.ReadSeeker).

Не беспокойтесь о том, что они не одного и того же типа. io.Readerявляется интерфейсом и может быть реализовано многими различными типами. Чтобы узнать немного больше об интерфейсах в Go, прочитайте Effective Go: Интерфейсы и типы .

Anisus
источник
Есть ли подобная функция, чтобы превратить []byteв io.Writer? Напримерbytes.NewWriter(destination)
byxor
4
@byxor Да, вы ищете bytes.Buffer. Там вы создаете буфер , который реализует io.Writerкак это: w := bytes.NewBuffer(destination).
ANisus
Я не понимаю эту ошибку от govet: cannot use *bytes.NewReader(out.Bytes()) (type bytes.Reader) as type io.Reader in argument to ioutil.NopCloser:(
Виталий Зданевич
1
@VitalyZdanevich Это потому, что bytes.Readerимеет указатели получателей, и вы превращаете его из типа указателя ( *bytes.Reader) в базовый тип ( bytes.Reader). Просто избавьтесь от звездочки ( *) и у вас все будет хорошо :)
ANisus
-19
r := strings(byteData)

Это также работает, чтобы превратить []byteвio.Reader

cmslotes
источник
4
Strings - это пакет, поэтому я предполагаю, что подразумевается строка (byteData). Таким способом вы можете получить строку из байтового фрагмента (минус s). String не реализует интерфейс io.Reader, так как у него нет метода Read (). play.golang.org/p/eRMmtHsscd - пример, который завершается неудачно, когда Read () вызывается для строки.
Джеффри