English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Na linguagem Go, a instrução select é semelhante ainstrução switchmas na instrução select, a instrução case se refere à comunicação, ou seja, operação de envio ou recebimento no canal.
sintaxe:
select{ case SendOrReceive1: // instrução case SendOrReceive2: // instrução case SendOrReceive3: // instrução ...... padrão: // instrução
Ponto importante:
A instrução Select aguarda a preparação da comunicação (operação de envio ou recebimento) para começar em alguns casos.
package main import ( "fmt" "time" ) // função 1 func portal1(channel1 chan string) { time.Sleep(3 * time.Second) channel1 <- "Bem-vindo ao canal 1" } // função 2 func portal2(channel2 chan string) { time.Sleep(9 * time.Second) channel2 <- "Bem-vindo ao canal 2" } func main() { // criar canal R1 := make(chan string) R2 := make(chan string) // chamada de função usando goroutine1e função2 go portal1(R1) go portal2(R2) select { // caso 1 case op1 := <-R1: fmt.Println(op1) // caso 2 case op2 := <-R2: fmt.Println(op2) } }
Saída:
Bem-vindo ao canal 1
Explicação de uso:no programa acima, portal1dormir3segundo, portal2dormir9segundos, após o fim do seu tempo de sono, eles estarão prontos para continuar. Agora, o comando select está esperando pelo tempo de sono deles, quando o portal2acordar, ele escolhe o caso 2e imprimir "Bem-vindo ao canal 1". Se o portal1no portal2acordar antes, então será impresso "Bem-vindo ao canal 2”。
se o comando select não contiver nenhuma sentença de caso, o comando select continuará a esperar para sempre.
sintaxe:
select{}
package main func main() { //não há nenhum caso, continuará a esperar select{ } }
Saída:
erro fatal: todas as goroutines estão adormecidas - deadlock! goroutine 1 [select (sem casos)]: main.main() /home/runner/main.go:9 +0x20 status de saída 2
a sentença padrão no comando select é usada para proteger o comando select de ser bloqueado. Quando nenhum caso está pronto para ser executado, esta sentença será executada.
package main import "fmt" func main() { //criar canal mychannel := make(chan int) select { case <-mychannel: padrão: fmt.Println("Não encontrado") } }
Saída:
Não encontrado
o bloqueio do comando select significa que, quando nenhum caso está pronto e o comando select não contém nenhuma sentença padrão, o comando select ficará bloqueado até que pelo menos um caso ou comunicação possa continuar.
package main func main() { //criar canal mychannel := make(chan int) //o canal ainda não está pronto //e não há uma sentença padrão select { case <-mychannel: } }
Saída:
erro fatal: todas as goroutines estão adormecidas - deadlock! goroutine 1 [chan receive]: main.main() /home/runner/main.go:14 +0x52 status de saída 2
no comando select, se estiver pronto para lidar com várias situações, pode escolher aleatoriamente uma delas.
package main import "fmt" //função 1 func portal1(channel1 chan string){ for i := 0; i <= 3; i++{ channel1 <- "Bem-vindo ao canal 1" } } //função 2 func portal2(channel2 chan string){ channel2 <- "Bem-vindo ao canal 2" } func main() { //criar canal R1:= make(chan string) R2:= make(chan string) //chamar funções de forma goroutine1e2 go portal1(R1) go portal2(R2) //escolha aleatória de um select{ case op1:= <- R1: fmt.Println(op1) case op2:= <- R2: fmt.Println(op2) } }
Saída:
Bem-vindo ao canal 2