Rumah >pembangunan bahagian belakang >Golang >Golang: Mengapa saya masih menerima mesej daripada saluran selepas pemasa dihentikan

Golang: Mengapa saya masih menerima mesej daripada saluran selepas pemasa dihentikan

PHPz
PHPzke hadapan
2024-02-09 23:36:091230semak imbas

Golang: Mengapa saya masih menerima mesej daripada saluran selepas pemasa dihentikan

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.

Kandungan soalan

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!

Penyelesaian

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam