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

Golang 基础教程

Golang 控制语句

Golang 函数 & 方法

Golang 结构体

Golang 切片 & 数组

Golang 字符串(String)

Pointeurs Golang

Interfaces Golang

Concurrence Golang

Erreurs Golang

Autres éléments divers Golang

Instructions Go Select et deadlock

Dans le langage Go, la phrase select est commeInstructions switchMais dans la phrase select, les cas de la phrase font référence à la communication, c'est-à-dire aux opérations d'envoi ou de réception sur le canal.

Syntaxe :

select{
    case SendOrReceive1: // Déclaration
    case SendOrReceive2: // Déclaration
    case SendOrReceive3: // Déclaration
    .......
    default : // Déclaration
 }

Dans cet article, nous allons apprendre à utiliser le cas par défaut pour éviter le deadlock. Mais d'abord, nous devons comprendre ce qu'est un deadlock ?

Deadlock :Lorsque vous essayez de lire ou d'écrire des données dans un canal mais que le canal n'a pas de valeur. Par conséquent, il bloque l'exécution actuelle de la goroutine et transmet le contrôle à d'autres goroutines, mais si il n'y a pas d'autres goroutines disponibles ou si d'autres goroutines sont endormies en raison de cette situation, le programme va s'effondrer. Ce phénomène est appelé deadlock. Comme dans l'exemple suivant :

package main
func main() {
    //Créer un canal
    //Le deadlock se produit parce qu'il n'y a pas de goroutine qui écrit
    //Par conséquent, la phrase select est bloquée à jamais
    c := make(chan int)
    select {
    case <-c :
    }
}

Sortie :

erreur fatale : toutes les goroutines sont endormies - deadlock !
goroutine 1 [canal réception] :
main.main()

Pour éviter cela, nous utilisons le cas par défaut dans la phrase select. Autrement dit, lorsque le programme entre en deadlock, le cas par défaut de la phrase select est exécuté pour éviter le deadlock. Comme dans l'exemple suivant, nous utilisons le cas par défaut dans la phrase select pour éviter le deadlock.

package main 
  
import "fmt"
  
func main() { 
  
    //Créer un canal
    c := make(chan int) 
    select { 
    case <-c : 
    default : 
        fmt.Println("!.. Cas par défaut..!") 
    } 
}

Sortie :

!.. Cas par défaut..!

Lorsque la phrase select n'a que des canaux nil, il est également permis d'utiliser le cas par défaut. Comme dans l'exemple suivant, le canal c est nil, donc il s'exécute dans le cas par défaut. Si le cas par défaut ici n'est pas disponible, le programme sera bloqué à jamais, entraînant un verrouillage des ressources.

package main
import "fmt"
func main() {
    //Créer un canal
    var c chan int
    select {
    case x1 := <-c :
        fmt.Println("Valeur : ", x1)
    default :
        fmt.Println("Cas par défaut...!")
    }
}

Sortie :

Default case...!