In der Go-Sprache ist Select eine sehr nützliche Sprachstruktur. Sie kann auf den Empfang von Daten auf mehreren Kanälen warten. Sobald einer der Kanäle Daten zum Empfangen hat, führt er sofort den entsprechenden Vorgang aus. Es gibt jedoch einige Fälle, in denen wir die Select-Anweisung in der Go-Sprache nicht verwenden können. Lassen Sie uns diese Situationen unten analysieren.
Das erste, was Sie verstehen müssen, ist, dass Sie beim Deklarieren eines Kanals in der Go-Sprache den Typ des Kanals angeben müssen und select nur verwendet werden kann, wenn der Typ dies kann verglichen, kopiert und geschlossen werden. Zum Beispiel die unten definierten Kanäle:
c1 := make(chan int) c2 := make(chan bool)
Sie können alle ausgewählt werden, da die Typen int und bool grundlegende Typen sind, die verglichen werden können.
Wenn wir jedoch einen Kanal vom Typ Struktur definieren, können wir select nicht direkt verwenden, zum Beispiel:
type MyStruct struct { x int y string } c := make(chan MyStruct)
Select kann nicht verwendet werden, da der Typ MyStruct nicht verglichen werden kann und daher nicht auf einem Kanal mit dem Kanaltyp MyStruct verwendet werden kann wählen.
Es gibt einen Sonderfall in select, nämlich die Standardanweisung, die ausgeführt wird, wenn nicht alle Fälle sofort ausgeführt werden können. Wenn wir die Standardanweisung in select verwenden, wird die Standardanweisung in jedem Fall auch dann ausgeführt, wenn Daten zu empfangen sind.
Bei Verwendung der Standardanweisung müssen wir jedoch alle möglichen Situationen in der Auswahl berücksichtigen, auch solche, die nicht berücksichtigt wurden. Wenn wir nicht alle Situationen berücksichtigen, können wir nicht die Standardeinstellung verwenden, da sonst potenzielle Fehler auftreten. Zum Beispiel der folgende Code:
select { case msg1 := <-c1: fmt.Println("received", msg1) case msg2 := <-c2: fmt.Println("received", msg2) default: fmt.Println("nothing received") // 未考虑到其他情况的default语句 }
In diesem Beispiel haben wir alle anderen Situationen nicht berücksichtigt, die dazu führen können, dass einige Daten ignoriert oder falsch verarbeitet werden. Wenn wir die Standardanweisung verwenden, müssen wir daher alle möglichen Situationen berücksichtigen.
Zusätzlich zur Standardanweisung gibt es auch eine Situation der synchronen Kommunikation in der Go-Sprache, dh wenn der Kanalpuffer gefüllt oder voll ist, können keine Daten geschrieben werden muss warten, bis eine andere Goroutine Daten empfängt. Select kann in diesem Fall nicht verwendet werden.
Zum Beispiel der folgende Code:
c := make(chan int, 1) c <- 1 c <- 2 // 缓冲区已满,此处会堵塞
In diesem Beispiel definieren wir einen Kanal mit einem Puffer mit einer Puffergröße von 1. Schreiben Sie zuerst Daten 1 in den Kanal und dann Daten 2 in den Kanal. Da der Puffer zu diesem Zeitpunkt voll ist, wird dieser Vorgang blockiert. Wenn wir in Select versuchen, Daten von diesem Kanal zu empfangen, wird dieser Vorgang ebenfalls blockiert, da der Puffer voll ist und keine anderen Vorgänge ausgeführt werden können.
Daher müssen Sie bei der Verwendung von select Deadlock-Situationen vermeiden und sicherstellen, dass die Lese- und Schreibvorgänge des Kanals unabhängig voneinander ausgeführt werden können.
Kurz gesagt, es ist sehr wichtig, select in der Go-Sprache richtig zu verwenden. Wir müssen alle möglichen Situationen berücksichtigen, um Programmierfehler und Deadlocks zu vermeiden. Gleichzeitig müssen wir uns auch einiger Sondersituationen bewusst sein, um zu vermeiden, dass select in unangemessenen Situationen verwendet wird, was zu Zeit- und Ressourcenverschwendung führt.
Das obige ist der detaillierte Inhalt vonGolang kann select nicht verwenden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!