English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutorial Básico Golang

Controle de fluxo Golang

Funções & Métodos Golang

Estruturas Golang

Fatias & Arrays Golang

Strings Golang (String)

Ponteiros Golang

Interfaces Golang

Concorrência Golang

Exceções Golang (Error)

Outros itens Golang

Sentença Select do Linguagem Go

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