Maison > développement back-end > Golang > Structures anonymes ou structures vides en Go : pourquoi utiliser `struct{}` pour la synchronisation Goroutine ?

Structures anonymes ou structures vides en Go : pourquoi utiliser `struct{}` pour la synchronisation Goroutine ?

DDD
Libérer: 2025-01-04 05:10:39
original
832 Les gens l'ont consulté

Anonymous Structs vs. Empty Structs in Go: Why Use `struct{}` for Goroutine Synchronization?

Structs anonymes vs. Structs vides dans Go

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 }
}
Copier après la connexion

[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 :

  • Pourquoi cette syntaxe est-elle nécessaire ?
  • Est-ce une structure anonyme ou une structure vide ?

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 :

  • Comme espace réservé pour un type qui peut être ajouté à l'avenir
  • Pour créer un type unique pouvant être utilisé pour la synchronisation
  • Pour créer un type pouvant être utilisé comme clé dans un map

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 :

  • Sans cette ligne, le programme ne produirait aucune sortie car la goroutine principale se terminerait avant que les autres goroutines n'aient terminé leur travail.
  • La boucle reçoit les valeurs du canal terminé, mais les ignore à l'aide de la variable générique _. C'est parce que nous ne sommes pas intéressés par les valeurs réelles envoyées par les goroutines. Nous voulons simplement attendre que toutes les goroutines aient signalé leur achèvement.

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal