Maison >développement back-end >Golang >Pourquoi mon cas de délai d'attente Golang ne se déclenche-t-il pas lors de l'utilisation des chaînes ?
Dans le code fourni, un cas de délai d'attente est implémenté à l'aide d'une instruction select et d'un appel time.After(). Cependant, le cas d'expiration n'est pas exécuté.
La raison en est que la fonction time.After() crée un nouveau canal à chaque fois qu'elle est appelée. Lorsque l'instruction select reçoit une valeur du canal c1 (dans la première boucle for), le canal time.After() existant est ignoré. Ainsi, le cas de timeout n'a jamais la possibilité de recevoir une valeur.
Pour résoudre ce problème, créez le canal time.After() une seule fois, en dehors de la boucle for. Cela garantit que le même canal est utilisé pour le cas de timeout tout au long de l'exécution.
Voici le code modifié :
func main() { c1 := make(chan int, 1) go func() { for { time.Sleep(1500 * time.Millisecond) c1 <- 10 } }() timeout := time.After(2000 * time.Millisecond) for { select { case i := <-c1: fmt.Println(i) case <-timeout: fmt.Println("TIMEOUT") } } fmt.Scanln() }
Avec cette modification, le cas de timeout sera exécuté avec succès après 2 secondes , tant qu'aucune valeur n'est reçue du canal c1 dans ce laps de temps.
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!