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

Golang Grundtutorials

Golang Steuerausdruck

Golang Funktion & Methode

Golang Struktur

Golang Slice & Array

Golang Zeichenkette(String)

Golang Zeiger

Golang Schnittstelle

Golang Parallelität

Golang Fehler(Error)

Andere Golang-Artikel

Go Sprache Select-Anweisung

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