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

Tutorial di base Golang

Statement di controllo Golang

Funzione & Metodo Golang

Struttura Golang

Taglia & Array Golang

Stringa (String) Golang

Puntatore Golang

Interfaccia Golang

Concordanza Golang

Eccezioni Golang (Error)

Altri argomenti Golang

Select del linguaggio Go

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