English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В языке 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..!