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 } }
[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:
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.:
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:
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!