Heim > Backend-Entwicklung > Golang > Golang: Warum erhalte ich immer noch Nachrichten vom Kanal, nachdem der Timer angehalten wurde?

Golang: Warum erhalte ich immer noch Nachrichten vom Kanal, nachdem der Timer angehalten wurde?

PHPz
Freigeben: 2024-02-09 23:36:09
nach vorne
1201 Leute haben es durchsucht

Golang: Warum erhalte ich immer noch Nachrichten vom Kanal, nachdem der Timer angehalten wurde?

Golang: Warum erhalte ich immer noch Nachrichten vom Kanal, nachdem der Timer angehalten wurde? Dies ist ein Problem, auf das viele Golang-Entwickler häufig stoßen, wenn sie Timer verwenden. Timer ist ein in Golang häufig verwendetes Werkzeug, mit dem nach einer bestimmten Zeit bestimmte Vorgänge ausgeführt werden. Manchmal erhalten wir jedoch auch dann Nachrichten vom Kanal, wenn wir den Timer explizit stoppen. Was genau verursacht dies? In diesem Artikel wird der PHP-Editor Zimo diese Frage ausführlich beantworten und entsprechende Lösungen bereitstellen.

Frageninhalt

Erster Code (Ausnahme):

var ti time.timer
func init() {
    ti = *time.newtimer(3 * time.second)
}
func main() {
    ti.stop()
    t := <-ti.c
    fmt.println("end", t) 
}
Nach dem Login kopieren

Zweiter Code (normal):

var ti *time.Timer
func init() {
    ti = time.NewTimer(3 * time.Second)
}
func main() {
    ti.Stop()
    t := <-ti.C
    fmt.Println("End", t) // deadlock!
}
Nach dem Login kopieren

Ich verstehe nicht, warum der erste Code nach dem Stoppen immer noch Nachrichten vom Timer-Kanal erhält. Ich glaube nicht, dass das normal ist, da es den Timer scheinbar unbrauchbar macht.

Der zweite Code ist normal, der Unterschied ist „var ti time.timer“ und „var ti *time.timer“, einer ist ein Wert und der andere ist ein Zeiger.

Ich kenne mich mit Hinweisen nicht aus, kann mir jemand helfen?

Danke!

Problemumgehung

Sie dereferenzieren den Ticker und sein Wert wird kopiert.

So stoppen Sie:

func (t *Ticker) Stop() {
    stopTimer(&t.r)
}
Nach dem Login kopieren

Wenn Sie einen Timer kopieren, &t.r zeigt er an eine andere Stelle. Deshalb stoppt Ihr Timer nicht.

Du solltest also *time.ticker 而不是 time.ticker verwenden.

Das obige ist der detaillierte Inhalt vonGolang: Warum erhalte ich immer noch Nachrichten vom Kanal, nachdem der Timer angehalten wurde?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage