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
Libérer: 2024-02-09 23:36:09
avant
1201 Les gens l'ont consulté

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) 
}
Copier après la connexion

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!
}
Copier après la connexion

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)
}
Copier après la connexion

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!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal