Capturer les valeurs de retour des goroutines
Contrairement aux appels de fonction conventionnels, les goroutines s'exécutent de manière asynchrone. Par conséquent, tenter de stocker la valeur de retour d'une goroutine directement dans une variable, comme le montre l'extrait de code, entraîne une erreur de compilation.
Raison de l'erreur
L'erreur provient de la nature conflictuelle de l'exécution asynchrone et de la récupération immédiate de la valeur. Lorsque vous utilisez une goroutine avec go, vous demandez au programme d'exécuter la fonction de manière asynchrone, sans attendre son achèvement. Cependant, l'attribution de la valeur de retour à une variable nécessite que la valeur soit disponible immédiatement.
Canaux : un mécanisme de transmission de valeur asynchrone
Pour contourner cette limitation, les canaux servent comme intermédiaires pour l’échange de valeurs entre goroutines. Les canaux vous permettent d'envoyer des valeurs d'une goroutine à une autre, permettant une récupération de valeurs asynchrone sans rompre la concurrence.
La mise en œuvre d'une approche basée sur les canaux, comme illustrée dans le code ci-dessous, vous permet de recevoir des valeurs des goroutines sans compromettre leur nature asynchrone :
func main() { c1 := make(chan string) c2 := make(chan string) go func() { time.Sleep(time.Second * 1) c1 <- "one" }() go func() { time.Sleep(time.Second * 2) c2 <- "two" }() for i := 0; i < 2; i++ { // Receive values from both channels concurrently select { case msg1 := <-c1: fmt.Println("received", msg1) case msg2 := <-c2: fmt.Println("received", msg2) } } }
Passage de messages et CSP Théorie
Le système de messagerie de Go s'inspire de la théorie CSP (Communicating Sequential Processes). Cette approche favorise la transmission de messages comme principal mécanisme de communication entre processus indépendants. L'exemple de code suit les principes de CSP en utilisant des canaux pour la communication asynchrone entre les goroutines.
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!