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ę.
io.Reader
? W takim przypadku odpowiednio ciało jest już tego typu.[]byte
na anio.Reader
(i io.ReadSeeker)*bytes.Reader
które implementujeio.Reader
interfejs.Odpowiedzi:
Aby uzyskać typ, który implementuje
io.Reader
z[]byte
plastra, możesz użyćbytes.NewReader
wbytes
pakiecie:To zwróci wartość typu,
bytes.Reader
który implementuje interfejsio.Reader
(iio.ReadSeeker
).Nie martw się, że nie są tego samego „typu”.
io.Reader
jest 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 .źródło
[]byte
wio.Writer
? Egbytes.NewWriter(destination)
bytes.Buffer
. Tam utworzyć bufor, który implementujeio.Writer
tak:w := bytes.NewBuffer(destination)
.govet
:cannot use *bytes.NewReader(out.Bytes()) (type bytes.Reader) as type io.Reader in argument to ioutil.NopCloser
:(bytes.Reader
ma 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 :)To również działa, aby przekształcić się
[]byte
wio.Reader
źródło