L'éditeur PHP Zimo a présenté : Dans le langage Go, l'instruction select est une instruction de flux de contrôle très importante. Elle est utilisée pour surveiller les opérations de plusieurs canaux en même temps pour obtenir un contrôle de simultanéité. Pourquoi faut-il attendre la sélection ? En effet, dans la programmation simultanée, nous devons généralement traiter des données ou des événements de plusieurs canaux en même temps, et l'instruction select peut nous aider à surveiller plusieurs canaux. Une fois que l'un des canaux est opérationnel, l'opération correspondante sera effectuée. réalisant ainsi la concurrence. En utilisant select, nous pouvons efficacement éviter le blocage et améliorer la réactivité et la concurrence du programme.
Je viens d'apprendre l'annulation du contexte. Voici mon code.
package main import ( "fmt" "context" ) func main() { ctx := context.Background() do(ctx) } func do(ctx context.Context) { ctx, ctxCancel := context.WithCancel(ctx) resultCh := make(chan string) go terminate(ctx, resultCh) resultCh <- "value1" resultCh <- "value2" fmt.Println("pre cancel") ctxCancel() fmt.Println("post cancel") } func terminate(ctx context.Context, ch <-chan string) { for { select { case <-ctx.Done(): fmt.Println("terminate") return case result := <-ch: fmt.Println(result) } } }
Pourquoi cela arrive-t-il. De quelles connaissances ai-je besoin ?
Mais le résultat réel obtenu ne contient pas de « terminaison ».
value1 value2 pre cancel terminate post cancel
J'ai ajouté du temps. Dormez sous la fonction d'annulation. Ensuite, le résultat est ce à quoi je m’attendais.
ctxCancel() time.Sleep(100 * time.Millisecond) // add
Si je comprends bien, l'idée principale derrière l'utilisation de select est d'attendre qu'au moins une condition soit "prête". J'ai inclus un exemple ci-dessous qui pourrait vous aider. Ici, la sélection est utilisée pour attendre qu'une valeur soit reçue du canal ch ou qu'un délai d'attente d'une seconde se produise.
import ( "fmt" "time" ) func main() { ch := make(chan int) go func() { // Simulate some time-consuming operation time.Sleep(2 * time.Second) ch <- 42 }() select { case result := <-ch: fmt.Println("Received result:", result) case <-time.After(1 * time.Second): fmt.Println("Timeout reached") } }
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!