Konversi byte slice ke io.Reader

177

Dalam proyek saya, saya memiliki irisan byte dari respons permintaan.

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
}

Ini berfungsi, tetapi jika saya ingin mendapatkan tubuh tanggapan io.Reader, bagaimana cara saya bertobat? Saya mencoba penulis / penulis baru tetapi tidak berhasil.

Chan Willson
sumber
3
Jika saya mengerti dengan benar, Anda ingin jawabannya io.Reader? Dalam hal ini resp.Body sudah seperti itu.
Arjan
3
golang.org/pkg/bytes/#NewReader akan "mengubah" a []bytemenjadi io.Reader(dan io.ReadSeeker)
ANisus
@Arjan yap ~ tubuh ... saya ingin mendapatkan respons sebagai io.reader .tapi di kelas dasar ketika saya menyelesaikan permintaan, responsnya telah dimatikan .. simpan saja badan tanggapan sebagai [] byte dalam struct.
Chan Willson
@ Alan saya akan mencoba .... thx bung ... omong-omong ... ini terlihat seperti jenis yang berbeda ..
Chan Willson
@ChanWillson: Persyaratan itu lebih masuk akal, tubuh tidak dapat dibaca setelah menutupnya. Seperti yang disarankan gunakan *bytes.Readeryang mengimplementasikan io.Readerantarmuka.
Arjan

Jawaban:

306

Untuk mendapatkan jenis yang mengimplementasikan io.Readerdari []byteslice, Anda dapat menggunakan bytes.NewReaderdalam bytespaket:

r := bytes.NewReader(byteData)

Ini akan mengembalikan nilai tipe bytes.Readeryang mengimplementasikan antarmuka io.Reader(dan io.ReadSeeker).

Jangan khawatir mereka tidak memiliki "tipe" yang sama. io.Readeradalah antarmuka dan dapat diimplementasikan oleh berbagai jenis. Untuk mempelajari lebih lanjut tentang antarmuka di Go, baca Efektif Go: Antarmuka dan Jenis .

Anisus
sumber
Apakah ada fungsi serupa untuk mengubah suatu []bytemenjadi io.Writer? Misalnyabytes.NewWriter(destination)
byxor
4
@byxor Ya, yang Anda cari adalah bytes.Buffer. Ada Anda membuat buffer yang menerapkan io.Writerseperti ini: w := bytes.NewBuffer(destination).
ANisus
Saya tidak mengerti kesalahan ini dari govet: cannot use *bytes.NewReader(out.Bytes()) (type bytes.Reader) as type io.Reader in argument to ioutil.NopCloser:(
Vitaly Zdanevich
1
@VitalyZdanevich Itu karena bytes.Readermemiliki penerima pointer, dan Anda mengubahnya dari tipe pointer ( *bytes.Reader) ke tipe dasar ( bytes.Reader). Cukup singkirkan tanda bintang ( *) dan Anda akan baik-baik saja :)
ANisus
-19
r := strings(byteData)

Ini juga berfungsi untuk berubah []bytemenjadiio.Reader

cmslotes
sumber
4
String adalah sebuah paket, jadi saya mengasumsikan string (byteData) dimaksudkan. Anda bisa mendapatkan string dari byte byte dengan cara itu (minus s). String tidak mengimplementasikan antarmuka io.Reader karena tidak memiliki metode Read (). play.golang.org/p/eRMmtHsscd adalah contoh yang gagal saat Read () dipanggil dengan string.
jeffrey