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 ?

Pourquoi mon cas de délai d'attente Golang ne se déclenche-t-il pas lors de l'utilisation des chaînes ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-18 11:38:15820parcourir

Why Doesn't My Golang Timeout Case Trigger When Using Channels?

Cas de délai d'attente non déclenché dans Golang avec les canaux

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é.

Explication

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.

Solution

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!

Déclaration:
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