Golang: Mengapa saya masih menerima mesej daripada saluran selepas pemasa dihentikan? Ini adalah masalah yang sering dihadapi oleh ramai pembangun Golang apabila menggunakan pemasa. Pemasa ialah alat yang biasa digunakan di Golang, yang digunakan untuk melakukan operasi tertentu selepas tempoh masa tertentu. Walau bagaimanapun, kadangkala walaupun kami menghentikan pemasa secara eksplisit, kami masih menerima mesej daripada saluran tersebut. Apakah sebenarnya yang menyebabkan perkara ini berlaku? Dalam artikel ini, editor PHP Zimo akan menjawab soalan ini secara terperinci dan menyediakan penyelesaian yang sepadan.
Kod pertama (pengecualian):
var ti time.timer func init() { ti = *time.newtimer(3 * time.second) } func main() { ti.stop() t := <-ti.c fmt.println("end", t) }
Kod kedua (biasa):
var ti *time.Timer func init() { ti = time.NewTimer(3 * time.Second) } func main() { ti.Stop() t := <-ti.C fmt.Println("End", t) // deadlock! }
Saya tidak faham mengapa kod pertama masih mendapat mesej daripada saluran pemasa selepas berhenti. Saya tidak fikir ini adalah perkara biasa kerana ia seolah-olah menjadikan pemasa tidak berguna.
Sekeping kod kedua adalah normal, perbezaannya ialah "var ti time.timer" dan "var ti *time.timer", satu ialah nilai dan satu lagi penunjuk.
Saya tidak biasa dengan penunjuk, boleh sesiapa membantu saya?
Terima kasih!
Anda membatalkan rujukan penanda dan nilainya disalin.
Berikut ialah cara untuk berhenti:
func (t *Ticker) Stop() { stopTimer(&t.r) }
Apabila anda menyalin pemasa, &t.r
tuding ke tempat lain. Itulah sebabnya pemasa anda tidak akan berhenti.
Jadi anda harus menggunakan *time.ticker
而不是 time.ticker
.
Atas ialah kandungan terperinci Golang: Mengapa saya masih menerima mesej daripada saluran selepas pemasa dihentikan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!