English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Im Go-Sprache ist die select-Anweisung ähnlich wieswitch-Anweisung,aber im select-Ausdruck bezieht sich der fall auf Kommunikation, d.h. Senden oder Empfangen über den Kanal.
Syntax:
select{ fall SendOrReceive1: // Anweisung fall SendOrReceive2: // Anweisung fall SendOrReceive3: // Anweisung ...... default: // Anweisung
Wichtig:
Select-Anweisung wartet auf Bereitschaft zur Kommunikation (Senden oder Empfangen) für bestimmte Fälle.
package main import ( "fmt" "time" ) // Funktion 1 func portal1(channel1 chan string) { time.Sleep(3 * time.Second) channel1 <- "Willkommen im Kanal 1" } // Funktion 2 func portal2(channel2 chan string) { time.Sleep(9 * time.Second) channel2 <- "Willkommen im Kanal 2" } func main() { // Erstelle einen Kanal R1 := make(chan string) R2 := make(chan string) // Funktion mit goroutine aufrufen1und Funktion2 go portal1(R1) go portal2(R2) select { // fall 1 case op1 := <-R1: fmt.Println(op1) // fall 2 case op2 := <-R2: fmt.Println(op2) } }
Ausgabe:
Willkommen im Kanal 1
Verwendungshinweis:Im obigen Programm, portal1schlafen3Sekunde, portal2schlafen9Sekunden nach dem Ende ihrer Schlafzeit, werden sie bereit sein, fortzufahren. Jetzt wartet der select-Ausdruck auf ihre Schlafzeit, wenn der portal2wacht, wählt es den case 2und "Willkommen im Kanal" ausgibt 1"。Wenn das Portal1im portal2wurde vorab geweckt, dann wird "Willkommen im Kanal" ausgegeben 2”。
Wenn ein select-Ausdruck keine case-Anweisungen enthält, wird dieser ausdrücklich immer warten.
Syntax:
select{}
package main func main() { //Es gibt keine case, der Ausdruck wird warten, bis eine der Bedingungen erfüllt ist select{ } }
Ausgabe:
Fataler Fehler: alle goroutines sind schlafend - Deadlock! goroutine 1 [select (no cases)]: main.main() /home/runner/main.go:9 +0x20 Abbruchstatus 2
Die Default-Anweisung in einem select-Ausdruck wird verwendet, um sicherzustellen, dass der select-Ausdruck nicht blockiert. Wird keine case-Anweisung bereit, wird diese Anweisung ausgeführt.
package main import "fmt" func main() { //Erstelle einen Kanal mychannel := make(chan int) select { case <-mychannel: default: fmt.Println("Nicht gefunden") } }
Ausgabe:
Nicht gefunden
Der Blockierungszustand eines select-Ausdrucks bedeutet, dass dieser blockiert, wenn keine case-Anweisung bereit ist und der select-Ausdruck keine Default-Anweisung enthält, bis mindestens ein case-Ausdruck oder eine Kommunikation bereit ist, um fortzufahren.
package main func main() { //Erstelle einen Kanal mychannel := make(chan int) //Der Kanal ist noch nicht bereit //und es gibt keine Default-Anweisung select { case <-mychannel: } }
Ausgabe:
Fataler Fehler: alle goroutines sind schlafend - Deadlock! goroutine 1 [chan receive]: main.main() /home/runner/main.go:14 +0x52 Abbruchstatus 2
In einem select-Ausdruck kann man zufällig eine der möglichen Fälle auswählen, wenn mehrere behandelt werden sollen.
package main import "fmt" //Funktion 1 func portal1(channel1 chan string){ for i := 0; i <= 3; i++{ channel1 <- "Willkommen im Kanal 1" } } //Funktion 2 func portal2(channel2 chan string){ channel2 <- "Willkommen im Kanal 2" } func main() { //Erstelle einen Kanal R1:= make(chan string) R2:= make(chan string) //Rufe die Funktion auf Weise mit goroutine auf1und2 go portal1(R1) go portal2(R2) //Wähle zufällig eine select{ case op1:= <- R1: fmt.Println(op1) case op2:= <- R2: fmt.Println(op2) } }
Ausgabe:
Willkommen im Kanal 2