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
Lepaskan: 2024-02-09 23:36:09
ke hadapan
1200 orang telah melayarinya

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) 
}
Salin selepas log masuk

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!
}
Salin selepas log masuk

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)
}
Salin selepas log masuk

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!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan