Maison >développement back-end >Golang >Golang : Pourquoi est-ce que je reçois toujours des messages de la chaîne après l'arrêt du minuteur

Golang : Pourquoi est-ce que je reçois toujours des messages de la chaîne après l'arrêt du minuteur

PHPz
PHPzavant
2024-02-09 23:36:091202parcourir

Golang : Pourquoi est-ce que je reçois toujours des messages de la chaîne après larrêt du minuteur

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.

Contenu de la question

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 !

Solution de contournement

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer