Konwertuj kawałek bajtów na io.Reader

177

W moim projekcie mam wycinek bajtu z odpowiedzi żądania.

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
}

To działa, ale jeśli chcę uzyskać treść odpowiedzi io.Reader, w jaki sposób mogę dokonać konwersji? Wypróbowałem nowy czytnik / pisarz, ale nie udało mi się.

Chan Willson
źródło
3
Jeśli dobrze rozumiem, chcesz otrzymać odpowiedź jako io.Reader? W takim przypadku odpowiednio ciało jest już tego typu.
Arjan
3
golang.org/pkg/bytes/#NewReader "zamieni" a []bytena an io.Reader(i io.ReadSeeker)
ANisus
@Arjan yap ~ body ... chcę otrzymać odpowiedź jako io.reader. Ale w klasie bazowej, kiedy kończę żądanie, odpowiedź została zabita. Po prostu zapisz treść odpowiedzi jako [] bajt w strukturze.
Chan Willson
@ANisus spróbuję .... dzięki koleś ... przy okazji ... wygląda jak inny typ ...
Chan Willson
@ChanWillson: To wymaganie ma więcej sensu, treść nie może zostać odczytana po zamknięciu. Jak sugerowano użycie, *bytes.Readerktóre implementuje io.Readerinterfejs.
Arjan

Odpowiedzi:

304

Aby uzyskać typ, który implementuje io.Readerz []byteplastra, możesz użyć bytes.NewReaderw bytespakiecie:

r := bytes.NewReader(byteData)

To zwróci wartość typu, bytes.Readerktóry implementuje interfejs io.Reader(i io.ReadSeeker).

Nie martw się, że nie są tego samego „typu”. io.Readerjest interfejsem i może być implementowany przez wiele różnych typów. Aby dowiedzieć się trochę więcej o interfejsach w Go, przeczytaj artykuł Efektywne Go: interfejsy i typy .

ANisus
źródło
Czy istnieje podobna funkcja przekształcania a []bytew io.Writer? Egbytes.NewWriter(destination)
byxor
4
@byxor Tak, to czego szukasz bytes.Buffer. Tam utworzyć bufor, który implementuje io.Writertak: w := bytes.NewBuffer(destination).
ANisus,
Nie rozumiem tego błędu z govet: cannot use *bytes.NewReader(out.Bytes()) (type bytes.Reader) as type io.Reader in argument to ioutil.NopCloser:(
Witalij Zdanevich
1
@VitalyZdanevich To dlatego, że bytes.Readerma odbiorniki wskaźnika i zmieniasz go z typu wskaźnika ( *bytes.Reader) na typ bazowy ( bytes.Reader). Po prostu pozbądź się gwiazdki ( *) i powinno być dobrze :)
ANisus
-18
r := strings(byteData)

To również działa, aby przekształcić się []bytewio.Reader

cmslotes
źródło
4
Strings to pakiet, więc zakładam, że chodziło o string (byteData). W ten sposób (bez s) można uzyskać ciąg z segmentu bajtów. Ciąg nie implementuje interfejsu io.Reader, ponieważ nie ma metody Read (). play.golang.org/p/eRMmtHsscd to przykład, który kończy się niepowodzeniem, gdy wywoływana jest Read () na łańcuchu.
jeffrey