Mengutamakan Go select Statement
Masalah:
Dalam pernyataan Go select, tertib penilaian untuk blok kes adalah bukan deterministik. Ini boleh membawa kepada situasi di mana blok kes tertentu tidak dimasukkan dengan segera, walaupun saluran yang sepadan sedia untuk menerima.
Senario:
Pertimbangkan sendRegularHeartbeats() fungsi yang menghantar mesej degupan jantung secara berkala dan ditamatkan apabila konteksnya dibatalkan. Jika konteks dibatalkan sebelum mesej degupan jantung pertama dihantar, kami menjangkakan tiada mesej degupan jantung akan dihantar.
Masalah dengan Penilaian Bukan Penentu:
Dalam beberapa kes , mesej degupan jantung dihantar walaupun konteks dibatalkan sebelum fungsi dimulakan. Ini kerana susunan penilaian tidak dapat diramalkan dan kes lalai atau degupan jantung mungkin dimasukkan sebelum kes konteks.
Cadangan Salah:
Satu penyelesaian yang dicadangkan ialah untuk menambah "isContextclosed"-semak dalam kes degupan jantung. Walau bagaimanapun, ini bukan penyelesaian yang boleh dipercayai kerana kedua-dua saluran konteks dan degupan jantung boleh menjadi sedia untuk dibaca secara serentak.
Penyelesaian Cadangan: Pilihan Primordial
Untuk mengutamakan kes konteks , kita boleh memperkenalkan pernyataan pilih primordial yang menguji saluran konteks sedia. Hanya jika saluran konteks tidak bersedia, pernyataan pilihan kedua akan dilaksanakan.
func sendRegularHeartbeats(ctx context.Context) { for { // Primordial select: Check for context channel being ready only. select { case <-ctx.Done(): return default: } // Secondary select: Handle heartbeat logic. select { case <-ctx.Done(): return case <-time.After(1 * time.Second): sendHeartbeat() } } }
Ketidaksempurnaan:
Walaupun pendekatan ini mengutamakan kes konteks secara berkesan, ia mungkin masih membenarkan acara "cukup dekat". Contohnya, jika peristiwa degupan jantung tiba sejurus selepas saluran konteks sedia, degupan jantung mungkin dihantar sebelum kes konteks dimasukkan. Tiada penyelesaian sempurna untuk isu ini dengan pelaksanaan bahasa Go semasa.
Atas ialah kandungan terperinci Bagaimanakah Kami Boleh Menjamin Keutamaan Pembatalan Konteks dalam Penyata `pilih` Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!