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.
io.Reader
? Dalam hal ini resp.Body sudah seperti itu.[]byte
menjadiio.Reader
(dan io.ReadSeeker)*bytes.Reader
yang mengimplementasikanio.Reader
antarmuka.Jawaban:
Untuk mendapatkan jenis yang mengimplementasikan
io.Reader
dari[]byte
slice, Anda dapat menggunakanbytes.NewReader
dalambytes
paket:Ini akan mengembalikan nilai tipe
bytes.Reader
yang mengimplementasikan antarmukaio.Reader
(danio.ReadSeeker
).Jangan khawatir mereka tidak memiliki "tipe" yang sama.
io.Reader
adalah antarmuka dan dapat diimplementasikan oleh berbagai jenis. Untuk mempelajari lebih lanjut tentang antarmuka di Go, baca Efektif Go: Antarmuka dan Jenis .sumber
[]byte
menjadiio.Writer
? Misalnyabytes.NewWriter(destination)
bytes.Buffer
. Ada Anda membuat buffer yang menerapkanio.Writer
seperti ini: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
memiliki 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 :)Ini juga berfungsi untuk berubah
[]byte
menjadiio.Reader
sumber