2015-04-20 3 views
48

В моем проекте у меня есть массив байтов из ответа запроса.Преобразование байтового массива в io.read в golang

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

+3

Если я правильно понимаю, что вы хотите, чтобы ответ, как 'io.Reader'? В этом случае resp.Body уже относится к этому типу. – Arjan

+3

http://golang.org/pkg/bytes/#NewReader «превратит» '[] byte' в' io.Reader' (и io.ReadSeeker) – ANisus

+0

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

ответ

100

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

r := bytes.NewReader(byteData) 

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

Не беспокойтесь о том, что они не являются «типом». io.Reader - это интерфейс и может быть реализован различными типами. Чтобы узнать немного о интерфейсах в Go, прочитайте Effective Go: Interfaces and Types.

-3

г: = строки (byteData)

Это также работает, чтобы включить [] байт в io.reader

+0

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

Смежные вопросы