Dalam Go, pakej konteks menyediakan mekanisme untuk mengurus tarikh akhir permintaan dan pembatalan. Kebocoran konteks boleh berlaku jika panggilan balik pembatalan tidak digunakan, yang membawa kepada operasi pembersihan intensif sumber dan kemungkinan kesan prestasi.
Pertimbangkan coretan kod berikut:
func Call(ctx context.Context, payload Payload) (Response, error) { req, err := http.NewRequest(...) ctx, cancel = context.withTimeout(ctx, time.Duration(3) * time.Second) // defer cancel() missing! return http.DefaultClient.Do(req) }
Alat go vet memberi amaran dengan betul tentang pembatalan penangguhan yang ditinggalkan() panggil. Panggilan ini penting kerana:
Tanpa panggilan pembatalan, goroutine yang dibuat oleh WithCancel atau WithTimeout kekal dalam ingatan selama-lamanya (sehingga penutupan program), yang membawa kepada kebocoran memori. Jika tingkah laku ini diulang berkali-kali, penggunaan memori akan meningkat.
Konteks yang tidak dibatalkan boleh menyebabkan kesesakan prestasi. Apabila permintaan HTTP yang konteksnya dibatalkan masih tidak lengkap, sumber digunakan untuk mengendalikannya dan kemungkinan permintaan cuba semula.
Untuk mengelakkan kebocoran konteks dan memastikan pengurusan sumber yang cekap, ia adalah amalan terbaik untuk menggunakan defer cancel() serta-merta selepas memanggil WithCancel() atau WithTimeout(). Ini memastikan bahawa operasi pembersihan dicetuskan dengan segera apabila konteks tidak diperlukan lagi.
Atas ialah kandungan terperinci Mengapakah `defer cancel()` Penting dalam Pakej Konteks Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!