Golang : Pourquoi est-ce que je reçois toujours des messages de la chaîne après l'arrêt du minuteur ? C'est un problème que de nombreux développeurs Golang rencontrent souvent lorsqu'ils utilisent des minuteries. La minuterie est un outil couramment utilisé dans Golang, qui permet d'effectuer des opérations spécifiques après une certaine période de temps. Cependant, parfois même si nous arrêtons explicitement le chronomètre, nous recevons toujours des messages de la chaîne. Qu’est-ce qui provoque exactement cela ? Dans cet article, l'éditeur PHP Zimo répondra à cette question en détail et proposera les solutions correspondantes.
Premier code (exception) :
var ti time.timer func init() { ti = *time.newtimer(3 * time.second) } func main() { ti.stop() t := <-ti.c fmt.println("end", t) }
Deuxième 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! }
Je ne comprends pas pourquoi le premier code reçoit toujours des messages du canal minuterie après l'arrêt. Je ne pense pas que ce soit normal car cela semble rendre la minuterie inutile.
Le deuxième morceau de code est normal, la différence est "var ti time.timer" et "var ti *time.timer", l'un est une valeur et l'autre est un pointeur.
Je ne connais pas les pointeurs, quelqu'un peut-il m'aider ?
Merci !
Vous déréférencez le ticker et sa valeur est copiée.
Voici comment arrêter :
func (t *Ticker) Stop() { stopTimer(&t.r) }
Lorsque vous copiez une minuterie, &t.r
pointe ailleurs. C'est pourquoi votre chronomètre ne s'arrête pas.
Vous devriez donc utiliser *time.ticker
而不是 time.ticker
.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!