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


3
Якщо я правильно розумію, ви хочете відповіді як io.Reader? У цьому випадку resp.Body вже є такого типу.
Ар'ян

3
golang.org/pkg/bytes/#NewReader "перетвориться" []byteна io.Reader(і io.ReadSeeker)
ANisus

@Arjan yap ~ body ... Я хочу отримати відповідь як io.reader .але в базовому класі, коли я закінчую запит, відповідь було вбито .. просто збережіть тіло відповіді як [] байт у структурі.
Чан Уілсон

@ANisus я спробую .... thx чувак .. до речі ... це схоже на інший тип ..
Chan Willson

@ChanWillson: Ця вимога має більше сенсу, тіло не може бути прочитане після закриття. Як пропонується використовувати, *bytes.Readerякий реалізує io.Readerінтерфейс.
Ар'ян

Відповіді:


304

Щоб отримати тип, який реалізується io.Readerз []byteфрагмента, ви можете використовувати bytes.NewReaderв bytesпакеті:

r := bytes.NewReader(byteData)

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

Не хвилюйтеся, що вони не одного типу. io.Readerє інтерфейсом і може бути реалізований багатьма різними типами. Щоб дізнатися трохи більше про інтерфейси в програмі Go, прочитайте « Ефективний перехід»: «Інтерфейси та типи» .


Чи існує аналогічна функція, щоб перетворити []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

-18
r := strings(byteData)

Це також працює, щоб перетворитися []byteнаio.Reader


4
Strings - це пакет, тому я припускаю, що мався на увазі рядок (byteData). Ви можете отримати рядок з байтового фрагмента таким чином (мінус s). String не реалізує інтерфейс io.Reader, оскільки він не має методу Read (). play.golang.org/p/eRMmtHsscd - приклад, який виходить з ладу під час виклику Read () на рядок.
Джефрі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.