Heim >Backend-Entwicklung >Python-Tutorial >Detaillierte Erläuterung der Verwendung der Switch-Anweisung und der Select-Anweisung in Golang

Detaillierte Erläuterung der Verwendung der Switch-Anweisung und der Select-Anweisung in Golang

零下一度
零下一度Original
2017-06-29 15:30:281936Durchsuche

Dieser Artikel führt Sie hauptsächlich in das Tutorial zur Verwendung von Switch und Select in Golang ein. Der Artikel stellt die Verwendung von Switch-Anweisung und Select-Anweisung ausführlich anhand von Beispielcode vor, der für jeden von gewisser Bedeutung ist In Bezug auf den Wert des Lernens können Freunde in Not dem Herausgeber folgen, um gemeinsam zu lernen.

Dieser Artikel stellt Ihnen hauptsächlich die relevanten Inhalte zur Verwendung von Switch und Select in Golang vor. Er wird als Referenz und zum Lernen geteilt 🎜>

1. Switch-Anweisung

Die Switch-Anweisung bietet eine bedingte Ausführungsmethode mit mehreren Zweigen. Jeder Fall kann einen
-Ausdruck

oder einen Typbezeichner enthalten. Ersteres kann auch als Case-Ausdruck bezeichnet werden. Daher ist die Switch-Anweisung in der Go-Sprache in eine Ausdrucks-Switch-Anweisung und eine Typ-Switch-Anweisung unterteilt.


1. Ausdruckswechselanweisung


Go wechselt jedes Element in der Reihenfolge von oben nach unten. Der Case-Ausdruck in einer Case-Anweisung wird ausgewertet. Solange festgestellt wird, dass der Ausdruck das gleiche Ergebnis wie der Switch-Ausdruck hat, wird die Case-Anweisung ausgewählt. Der Rest der case-Anweisungen wird ignoriert. Beispielsweise kann die Switch-Anweisung auch Initialisierungswörter enthalten, und ihr Aussehen und ihre Schreibweise sind genau gleich:

var name string 
... 
switch name { 
case "Golang": 
 fmt.Println("Golang") 
case "Rust": 
 fmt.Println("Rust") 
default: 
 fmt.Println("PHP是世界上最好的语言") 
}


2. Geben Sie die Switch-Anweisung
names := []string{"Golang","java","PHP"} 
switch name:=names[0];name { 
case "Golang": 
 fmt.Println("Golang") 
... 
default: 
 fmt.Println("Unknown") 
}

und der allgemeinen Form. Der erste Punkt ist, dass das, was auf das Schlüsselwort case folgt, kein Ausdruck, sondern ein Typbezeichner ist. Ein Typspezifizierer besteht aus mehreren Typliteralen, und mehrere Typliterale werden durch Kommas getrennt. Der zweite Punkt ist, dass sein Schalterausdruck etwas ganz Besonderes ist. Dieser spezielle Ausdruck spielt auch die Rolle der Typzusicherung, aber sein Ausdruck ist sehr speziell, wie zum Beispiel: , wobei v einen Wert vom Typ Schnittstelle
darstellen muss. Dieser Ausdruckstyp kann nur in Typwechselanweisungen vorkommen und nur als Wechselausdrücke dienen. Ein Beispiel für eine Typ-Switch-Anweisung lautet wie folgt:

v.(type)

Hier weisen wir das Ergebnis des Switch-Ausdrucks einer Variablen zu. Auf diese Weise können wir dieses Ergebnis in der Switch-Anweisung verwenden. Nachdem dieser Code ausgeführt wurde, lautet die Ausgabe: „


v := 11 
switch i := interface{}(v).(type) { 
case int, int8, int16, int32, int64: 
 fmt.Println("A signed integer:%d. The type is %T. \n", v, i) 
case uint, uint8, uint16, uint32, uint64: 
 fmt.Println("A unsigned integer: %d. The type is %T. \n", v, i) 
default: 
 fmt.Println("Unknown!") 
}
Lassen Sie uns abschließend über den Fallthrough sprechen. Es ist sowohl ein Schlüsselwort als auch eine Aussage. Eine Fallthrough-Anweisung kann in eine Case-Anweisung innerhalb einer Ausdrucks-Switch-Anweisung eingefügt werden. Seine Funktion besteht darin, die Kontrolle an den nächsten Fall zu übergeben. Bitte beachten Sie jedoch, dass die Fallthrough-Anweisung nur als letzte Anweisung in der Case-Anweisung erscheinen kann. Darüber hinaus ist die Case-Anweisung, die sie enthält, nicht die letzte Case-Anweisung der Switch-Anweisung, zu der sie gehört.

A signed integer:11. The type is int.

2. Select-Anweisung

Die Funktion von Golangs Select ähnelt Select, Poll und Epoll dient der Überwachung des E/A-Vorgangs. Wenn ein E/A-Vorgang auftritt, wird die entsprechende Aktion ausgelöst.
Beispiel:


Beachten Sie, dass die Codeform von select der von switch sehr ähnlich ist, aber die Operationsanweisungen in Bei Auswahl ist nur eine [IO-Operation] möglich.


In diesem Beispiel wartet select, bis eine bestimmte Case-Anweisung abgeschlossen ist, d. h. bis die Daten erfolgreich von CH1 oder CH2 gelesen wurden. Die Select-Anweisung endet.
ch1 := make (chan int, 1) 
ch2 := make (chan int, 1) 
 
... 
 
select { 
case <-ch1: 
 fmt.Println("ch1 pop one element") 
case <-ch2: 
 fmt.Println("ch2 pop one element") 
}


Die break-Anweisung kann auch in der case-Anweisung in der select-Anweisung enthalten sein. Seine Funktion besteht darin, die Ausführung der aktuellen Select-Anweisung sofort zu beenden. Unabhängig davon, ob in der Case-Anweisung, zu der sie gehört, nicht ausgeführte Anweisungen vorhanden sind.


[Verwenden Sie die Auswahl, um den Timeout-Mechanismus zu implementieren]


wie folgt:


Wenn das Timeout auftritt Zeit ist Betriebszeit, Fall2 wird erfolgreich ausgeführt. Die Select-Anweisung wird also

beendet
. Anstatt den Lesevorgang von ch immer zu blockieren. Dies implementiert die Timeout-Einstellung für CH-Lesevorgänge.

timeout := make(chan bool, 1) 
go func() { 
 time.Sleep(time.Second * 10) 
 timeout <- true 
}() 
select { 
case <-pssScanResponseChan: 
 
case <-timeout: 
 fmt.PrintIn("timeout!") 
}

Das Folgende ist interessanter.
Wenn die Select-Anweisung Standard enthält:


Zu diesem Zeitpunkt sind case1 und case2 beide leer, da ch1 und ch2 beide leer sind wird erfolgreich gelesen. Wählen Sie dann aus, um die Standardanweisung auszuführen.


Aufgrund dieser Standardfunktion können wir die Select-Anweisung verwenden, um zu erkennen, ob der Kanal voll ist.
ch1 := make (chan int, 1) 
ch2 := make (chan int, 1) 
 
select { 
case <-ch1: 
 fmt.Println("ch1 pop one element") 
case <-ch2: 
 fmt.Println("ch2 pop one element") 
default: 
 fmt.Println("default") 
}


lautet wie folgt:


Weil der Kanal beim Einfügen von 1 bereits voll ist. Wenn der Kanal 2 eingefügt werden soll, ist dies der Fall festgestellt, dass ch bereits voll ist (case1 ist blockiert), dann führt select die Standardanweisung aus. Auf diese Weise ist es möglich zu erkennen, ob der Kanal voll ist, anstatt ständig zu warten.


Wenn wir beispielsweise einen Dienst haben und eine Anfrage eingeht, generieren wir einen Job und werfen ihn in den Kanal, und andere Coroutinen holen den Job vom Kanal zur Ausführung. Wir hoffen jedoch, dass wir den Job abbrechen und antworten, wenn der Kanal ausgeblendet ist: [Der Dienst ist ausgelastet, bitte versuchen Sie es später erneut. ] Sie können select verwenden, um diese Anforderung zu erfüllen.
ch := make (chan int, 1) 
ch <- 1 
select { 
case ch <- 2: 
default: 
 fmt.Println("channel is full !") 
}

此外,利用default特性,我们可以使用select语句将chan清空,如下:


flag := false 
for { 
 select { 
 case <-pssScanResponseChan: 
 continue 
 default: 
 flag = true 
 } 
 if true == flag { 
 break 
 } 
}

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Verwendung der Switch-Anweisung und der Select-Anweisung in Golang. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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