English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Nel linguaggio Go, lo statement select è simile aStatement switchMa nel statement select, i statement case si riferiscono alla comunicazione, ossia all'operazione di invio o ricezione sul canale.
Sintassi:
select{ case SendOrReceive1: //Statement case SendOrReceive2: //Statement case SendOrReceive3: //Statement ...... default: //Statement
Cosa sapere:
Lo statement select aspetta che la comunicazione (operazione di invio o ricezione) sia pronta per iniziare in alcuni casi.
package main import ( "fmt" "time" ) //Funzione 1 func portal1(channel1 chan string) { time.Sleep(3 * time.Second) channel1 <- "Benvenuto nel canale 1" } //Funzione 2 func portal2(channel2 chan string) { time.Sleep(9 * time.Second) channel2 <- "Benvenuto nel canale 2" } func main() { //Creare un canale R1 := make(chan string) R2 := make(chan string) //Chiamare le funzioni 1 e 2 con goroutine go portal1(R1) go portal2(R2) select { //case 1 case op1 := <-R1: fmt.Println(op1) //case 2 case op2 := <-R2: fmt.Println(op2) } }
Output:
Benvenuto nel canale 1
Spiegazione dell'uso:Nel programma sopra, portal1 si addormenta per 3 secondi, portal2 si addormenta per 9 secondi, alla fine del loro tempo di sonno, si prepareranno a continuare. Ora, lo statement select aspetta il loro tempo di sonno, quando portal2 si sveglia, sceglie case 2 e output "Benvenuto nel canale 1". Se il portale 1 si sveglia prima del portal2, allora output "Benvenuto nel canale 2".
Se lo statement select non contiene alcun statement case, lo statement select aspetterà per sempre.
Sintassi:
select{}
package main func main() { //nessun caso, aspetterà sempre select{ } }
Output:
errore fatale: tutti i goroutine sono addormentati - blocco! goroutine 1 [select (no cases)]: main.main() /home/runner/main.go:9 +0x20 Stato di uscita 2
La frase di default nella selezione select serve a proteggere la selezione select dal blocco. Quando non ci sono frasi di caso pronte, viene eseguita questa frase.
package main import "fmt" func main() { // Creazione dei canali mychannel := make(chan int) select { case <- mychannel: default: fmt.Println("Non trovato") } }
Output:
Non trovato
Il blocco della selezione select significa che quando nessun caso è pronto e la selezione select non contiene alcuna frase di default, la selezione select verrà bloccata fino a quando almeno un caso o la comunicazione può continuare.
package main func main() { // Creazione dei canali mychannel := make(chan int) // Il canale non è pronto // E non c'è una frase di default select { case <- mychannel: } }
Output:
errore fatale: tutti i goroutine sono addormentati - blocco! goroutine 1 [chan receive]: main.main() /home/runner/main.go:14 +0x52 Stato di uscita 2
Nella selezione select, se si sono pronti a gestire più casi, si può scegliere casualmente uno di essi.
package main import "fmt" // Funzione 1 func portal1(channel1 chan string){ for i := 0; i <= 3; i++{ channel1 <- "Benvenuto nel canale 1" } } // Funzione 2 func portal2(channel2 chan string){ channel2 <- "Benvenuto nel canale 2" } func main() { // Creazione dei canali R1 := make(chan string) R2 := make(chan string) // Chiamata ai funzioni 1 e 2 tramite goroutine go portal1(R1) go portal2(R2) // Scelta casuale di uno di essi select{ case op1 := <- R1: fmt.Println(op1) case op2 := <- R2: fmt.Println(op2) } }
Output:
Benvenuto nel canale 2