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.
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) }
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! }
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!
Sie dereferenzieren den Ticker und sein Wert wird kopiert.
So stoppen Sie:
func (t *Ticker) Stop() { stopTimer(&t.r) }
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!