Considérez l'extrait de code suivant, qui utilise un canal de type struct{} pour faciliter la communication entre les goroutines :
package main import "fmt" var battle = make(chan string) func warrior(name string, done chan struct{}) { select { case opponent := <-battle: fmt.Printf("%s beat %s\n", name, opponent) case battle <- name: // I lost :-( } done <- struct{}{} } func main() { done := make(chan struct{}) langs := []string{"Go", "C", "C++", "Java", "Perl", "Python"} for _, l := range langs { go warrior(l, done) } for _ = range langs { <-done } }
[Question 1]
La ligne done <- struct{}{}, qui envoie une structure vide au canal done, a semé la confusion. Alors qu'une structure ordinaire peut être déclarée avec struct { /* field */ }, une structure vide est désignée par struct{}{}, ce qui soulève quelques questions :
Un vide struct est une structure qui n'a aucun champ. Elle est également connue sous le nom de structure anonyme. Le but d'une structure vide est de fournir un moyen de créer un type sans champs, ce qui peut être utile pour diverses raisons, telles que :
Dans notre code, nous utilisons une structure anonyme pour signaler qu'une goroutine a terminé son travail. Utiliser une structure vide à cette fin est avantageux car elle a une taille de 0, minimisant l'empreinte mémoire.
[Question 2]
La ligne pour _ = range langs { <-done } est responsable de la réception et de la suppression des valeurs du canal terminé. Cette ligne est nécessaire pour les raisons suivantes :
En utilisant un canal de type struct{} et une structure vide comme mécanisme de signalisation, nous pouvons obtenir une communication efficace entre les goroutines avec une surcharge minimale. .
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!