Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah saya Boleh Membaca daripada io.Reader Berbilang Kali dalam Go?
Baca Berbilang Kali daripada Single io.Reader
In Go, menggunakan antara muka io.ReadCloser untuk membaca data daripada sumber boleh membentangkan cabaran apabila cuba membacanya beberapa kali. Sebagai contoh, pertimbangkan senario di mana anda ingin menggunakan request.Body (taip io.ReadCloser), yang mengandungi imej, untuk menulis terus ke fail dan penyahkodan.
Masalah:
Percubaan untuk mencipta berbilang kejadian pembaca, seperti dalam kod berikut, menyebabkan panggilan kedua mengembalikan sifar nilai:
package main import ( "io/ioutil" "log" "strings" ) func main() { r := strings.NewReader("some io.Reader stream to be read\n") a := &r b := &r log.Println(ioutil.ReadAll(*a)) log.Println(ioutil.ReadAll(*b)) }
Penyelesaian:
Antara muka io.Reader memodelkan strim, bermakna ia tidak boleh dibaca dua kali. Untuk mengatasi had ini, anda boleh menggunakan fungsi io.TeeReader untuk mencipta strim pendua.
package main import ( "bytes" "io" "io/ioutil" "log" "strings" ) func main() { r := strings.NewReader("some io.Reader stream to be read\n") var buf bytes.Buffer tee := io.TeeReader(r, &buf) log.Println(ioutil.ReadAll(tee)) log.Println(ioutil.ReadAll(&buf)) }
Kod ini menunjukkan cara menggunakan io.TeeReader untuk mencipta strim pendua daripada r dan menulis kandungan pada kedua-duanya tee dan buf. Dengan membaca daripada tee dahulu, anda boleh memastikan penimbal diisi dengan kandungan strim.
Atas ialah kandungan terperinci Bagaimanakah saya Boleh Membaca daripada io.Reader Berbilang Kali dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!