Heim > Backend-Entwicklung > Golang > Anonyme Strukturen vs. leere Strukturen in Go: Warum „struct{}' für die Goroutine-Synchronisierung verwenden?

Anonyme Strukturen vs. leere Strukturen in Go: Warum „struct{}' für die Goroutine-Synchronisierung verwenden?

DDD
Freigeben: 2025-01-04 05:10:39
Original
831 Leute haben es durchsucht

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

Anonyme Strukturen vs. leere Strukturen in Go

Betrachten Sie den folgenden Codeausschnitt, der einen Kanal vom Typ struct{} verwendet, um die Kommunikation zwischen Goroutinen zu erleichtern:

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 }
}
Nach dem Login kopieren

[Frage 1]

Die Zeile done <- struct{}{}, die eine leere Struktur an den done-Kanal sendet, hat Verwirrung gestiftet. Während eine gewöhnliche Struktur mit struct { /* Fields */ } deklariert werden kann, wird eine leere Struktur mit struct{}{} bezeichnet, was einige Fragen aufwirft:

  • Warum ist diese Syntax notwendig?
  • Ist das eine anonyme Struktur oder eine leere Struktur?

Eine leere Struktur struct ist eine Struktur, die keine Felder hat. Es ist auch als anonyme Struktur bekannt. Der Zweck einer leeren Struktur besteht darin, eine Möglichkeit zum Erstellen eines Typs ohne Felder bereitzustellen, was aus verschiedenen Gründen nützlich sein kann, z. B.:

  • Als Platzhalter für einen Typ, der hinzugefügt werden kann in der Zukunft
  • Als eine Möglichkeit, einen eindeutigen Typ zu erstellen, der für die Synchronisierung verwendet werden kann
  • Als eine Möglichkeit, einen Typ zu erstellen, der als Schlüssel in einem verwendet werden kann Karte

In unserem Code verwenden wir eine anonyme Struktur, um zu signalisieren, dass eine Goroutine ihre Arbeit beendet hat. Die Verwendung einer leeren Struktur für diesen Zweck ist vorteilhaft, da sie eine Größe von 0 hat und so den Speicherbedarf minimiert.

[Frage 2]

Die Zeile für _ = Bereichssprachen { <-done } ist für den Empfang und das Verwerfen von Werten vom Fertig-Kanal verantwortlich. Diese Zeile ist aus folgenden Gründen notwendig:

  • Ohne diese Zeile würde das Programm keine Ausgabe erzeugen, da die Haupt-Goroutine beendet würde, bevor die anderen Goroutinen ihre Arbeit abgeschlossen hätten.
  • Die Schleife empfängt Werte vom Fertig-Kanal, verwirft sie jedoch mithilfe der Platzhaltervariablen _. Dies liegt daran, dass wir nicht an den tatsächlichen Werten interessiert sind, die von den Goroutinen gesendet werden. Wir wollen einfach warten, bis alle Goroutinen ihren Abschluss signalisiert haben.

Durch die Verwendung eines Kanals vom Typ struct{} und einer leeren Struktur als Signalmechanismus können wir eine effiziente Kommunikation zwischen Goroutinen mit minimalem Overhead erreichen .

Das obige ist der detaillierte Inhalt vonAnonyme Strukturen vs. leere Strukturen in Go: Warum „struct{}' für die Goroutine-Synchronisierung verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage