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

Golang базовый учебник

Golang управляющие структуры

Golang функции и методы

Golang структуры

Golang срезы и массивы

Golang строки (String)

Golang указатели

Golang интерфейсы

Golang параллелизм

Golang исключения (Error)

Golang другие статьи

Go Select выражение и deadlock deadlock

В языке Go, выражение select resemblesswitch выражениено в выражении select, случая引用 коммуникацию, то есть отправку или прием на канале.

Синтаксис:

select{
    case SendOrReceive1: // Statement
    case SendOrReceive2: // Statement
    case SendOrReceive3: // Statement
    ......
    default: // Стatement
 }

В этой статье мы узнаем, как использовать default случай, чтобы избежать deadlock. Но сначала, мы узнаем, что такое deadlock?

Deadlock:Когда вы пытаетесь прочитать или写入 данные из канала, но в канале нет значения. Таким образом, это блокирует текущее выполнение goroutine и передает контроль в другие goroutine, но если другие goroutine недоступны или спят, из-за этой ситуации программа будет崩溃. Это явление называется deadlock. Как показано в следующем примере:

package main
func main() {
    //Создать канал
    //Deadlock возникает из-за отсутствия goroutine, который пишет
    //Таким образом, выражение select блокируется навсегда
    c := make(chan int)
    select {
    case <-c:
    }
}

Вывод:

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

Чтобы избежать этой ситуации, мы используем default случай в выражении select. Иначе говоря, когда в программе出现 deadlock, выполняется default случай выражения select, чтобы избежать deadlock. Как показано в следующем примере, мы используем default случай в выражении select, чтобы избежать deadlock.

package main 
  
import "fmt"
  
func main() { 
  
    //Создать канал
    c := make(chan int) 
    select { 
    case <-c: 
    default: 
        fmt.Println("!.. Default case..!") 
    } 
}

Вывод:

!.. Default case..!

Когда в выражении select используется только nil канал, также допускается использование default случая. Как показано в следующем примере, канал c является nil, поэтому выполняется по умолчанию. Если default случай здесь недоступен, то программа будет永远 блокирована,出现 deadlock.

package main
import "fmt"
func main() {
    //Создать канал
    var c chan int
    select {
    case x1 := <-c:
        fmt.Println("Value: ", x1)
    default:
        fmt.Println("Default case..!")
    }
}

Вывод:

Default case..!