Rumah >pembangunan bahagian belakang >Golang >Bagaimana Mengutamakan Kes dalam Pernyataan `pilih` Go untuk Pelaksanaan Deterministik?
Mengatasi Keutamaan dalam Penyata pilih Go
Apabila menggunakan penyataan pilih dalam Go, susunan penilaian kes biasanya tidak bersifat deterministik. Walau bagaimanapun, dalam sesetengah senario, kami mungkin perlu mengutamakan pelaksanaan kes tertentu.
Keutamaan dengan Pembatalan Konteks
Pertimbangkan kod berikut yang kami mahu tutup dengan anggun pengirim degupan jantung apabila konteks dibatalkan:
func sendRegularHeartbeats(ctx context.Context) { for { select { case <-ctx.Done(): return case <-time.After(1 * time.Second): sendHeartbeat() } } }
Namun, apabila konteks ditutup serta-merta, kod mungkin masih menghantar degupan jantung sebelum kes "Selesai" dilaksanakan.
Penyelesaian: Keutamaan dengan Saluran Pembantu
Satu pendekatan untuk menyelesaikan masalah ini ialah menggunakan saluran pembantu untuk mengutamakan kes pembatalan konteks:
func sendRegularHeartbeats(ctx context.Context) { done := make(chan struct{}) go func() { <-ctx.Done() close(done) }() for { select { case <-done: return case <-time.After(1 * time.Second): sendHeartbeat() } } }
Dalam kes ini, saluran selesai memastikan bahawa kes "ctx.Done()" dinilai terlebih dahulu apabila konteksnya dibatalkan.
Pertimbangan Tambahan
Walaupun penyelesaian ini meningkatkan keutamaan, ia tidak sepenuhnya menghapuskan kemungkinan degupan jantung dihantar sebelum kes "Selesai" dilaksanakan. Untuk penutupan yang benar-benar disegerakkan, pertimbangkan untuk menggunakan primitif penyegerakan seperti pembolehubah atom atau mutex untuk memastikan penghantaran degupan jantung ditamatkan serta-merta selepas pembatalan konteks.
Atas ialah kandungan terperinci Bagaimana Mengutamakan Kes dalam Pernyataan `pilih` Go untuk Pelaksanaan Deterministik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!