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ę.


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 .


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.