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

Golang Grundkurs

Golang Kontrollanweisungen

Golang Funktion & Methode

Golang Struktur

Golang Slice & Array

Golang Zeichenkette (String)

Golang Zeiger

Golang Schnittstelle

Golang Parallelität

Golang Ausnahme(Error)

Golang andere Artikel

Go Select-Anweisung und Deadlock

In der Go-Sprache ähnelt die select-Anweisungswitch-Anweisung,aber im select-Ausdruck bezieht sich das case-Statement auf die Kommunikation, d.h. auf den Senden- oder Empfangsvorgang über den Kanal.

Syntax:

select{
    case SendOrReceive1: // Anweisung
    case SendOrReceive2: // Anweisung
    case SendOrReceive3: // Anweisung
    .......
    default: // Anweisung
 }

In diesem Artikel werden wir lernen, wie man Deadlocks mit Standardfällen vermeidet. Aber bevor wir das tun, verstehen wir, was ein Deadlock ist?

Deadlock:Wenn Sie versuchen, von einem Kanal Daten zu lesen oder zu schreiben, aber der Kanal hat keinen Wert. Daher blockiert es die aktuelle Ausführung der goroutine und übergibt die Kontrolle an andere goroutines, aber wenn keine anderen goroutines verfügbar sind oder andere goroutines schlafen, aufgrund dieser Situation wird das Programm abstürzen. Dieses Phänomen wird als Deadlock bezeichnet. Wie im folgenden Beispiel gezeigt wird:

package main
func main() {
    //Erstellen Sie einen Kanal
    //Ein Deadlock tritt auf, weil keine goroutine schreibt
    //Daher wird die select-Anweisung für immer blockiert
    c := make(chan int)
    select {
    case <-c:
    }
}

Ausgabe:

fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan receive]:
main.main()

Um dies zu vermeiden, verwenden wir im select-Ausdruck den Standardfall. Mit anderen Worten, wenn ein Deadlock im Programm auftritt, wird der Standardfall der select-Anweisung ausgeführt, um den Deadlock zu vermeiden. Wie im folgenden Beispiel gezeigt wird, verwenden wir im select-Ausdruck den Standardfall, um den Deadlock zu vermeiden.

package main 
  
import "fmt"
  
func main() { 
  
    //Erstellen Sie einen Kanal
    c := make(chan int) 
    select { 
    case <-c: 
    default: 
        fmt.Println("!.. Default case..!") 
    } 
}

Ausgabe:

!.. Default case..!

Wenn die select-Anweisung nur einen nil-Kanal hat, wird auch die Standardfall-Zustimmung erlaubt. Wie im folgenden Beispiel gezeigt wird, ist der Kanal c nil, daher wird im Standardfall ausgeführt. Wenn der Standardfall hier nicht verfügbar ist, wird das Programm für immer blockiert und ein Deadlock tritt auf.

package main
import "fmt"
func main() {
    //Erstellen Sie einen Kanal
    var c chan int
    select {
    case x1 := <-c:
        fmt.Println("Wert: ", x1)
    default:
        fmt.Println("Default case..!")
    }
}

Ausgabe:

Standardfall ..!