NopCloser: A Closer Without Closing Actions in Go
In Go, fungsi io/ioutil.NopCloser ialah utiliti yang berguna untuk mencipta io.ReadCloser antara muka tanpa pelaksanaan kaedah Tutup sebenar. Ia pada asasnya membungkus Pembaca yang disediakan menjadi ReadCloser sambil memastikan bahawa sebarang panggilan untuk Tutup diabaikan.
Dokumentasi rasmi mentakrifkan NopCloser sebagai, "Mengembalikan ReadCloser dengan kaedah Tutup tanpa operasi membalut Reader r yang disediakan."
Bila Menggunakan NopCloser
NopCloser terbukti amat berguna apabila anda perlu mengembalikan io.ReadCloser tetapi tidak mempunyai sumber asas untuk ditutup. Dengan membalut Pembaca dengan NopCloser, anda menjamin bahawa kaedah Tutupnya wujud, menghapuskan keperluan untuk mengurus pembersihan sumber secara manual.
Pertimbangkan senario di mana anda melaksanakan pengendali HTTP tersuai yang membaca data daripada memori:
type MemReader struct { data []byte } func (r *MemReader) Read(p []byte) (n int, err error) { copy(p, r.data) return len(r.data), nil }
Pengendali anda mungkin kelihatan seperti ini:
func handler(w http.ResponseWriter, r *http.Request) { // Read data from memory. data := MemReader{[]byte("Hello World!")} io.Copy(w, &data) }
Dalam kes ini, MemReader tidak mempunyai kaedah Tutup, jadi mengembalikan &data secara terus daripada pengendali akan melanggar http .Antara muka pengendali (yang menjangkakan io.ReadCloser untuk membaca badan permintaan). Untuk menyelesaikan masalah ini, anda boleh membalut MemReader dengan NopCloser:
type MemReader struct { data []byte } func (r *MemReader) Read(p []byte) (n int, err error) { copy(p, r.data) return len(r.data), nil } func handler(w http.ResponseWriter, r *http.Request) { data := MemReader{[]byte("Hello World!")} io.Copy(w, ioutil.NopCloser(&data)) }
Ini memastikan bahawa antara muka http.Handler ditegakkan tanpa memperkenalkan pengurusan sumber yang tidak perlu.
Contoh Penggunaan
Satu lagi contoh praktikal menggunakan NopCloser ialah apabila anda mempunyai fungsi yang menjana data tetapi tidak memerlukan penutupan sebarang sumber:
func generateData() *strings.Reader { return ioutil.NopCloser(strings.NewReader("Generated data")) }
Dalam senario ini, menggunakan NopCloser membenarkan *rentetan. Pembaca untuk memenuhi antara muka io.ReadCloser tanpa sebarang operasi pembersihan sebenar.
Atas ialah kandungan terperinci Bilakah Anda Harus Menggunakan ioutil.NopCloser Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!