В языке Go оператор select похож на оператор switch , но в операторе select оператор case относится к коммуникации, т. е. операции отправки или получения по каналу.

Синтаксис:
select{
case SendOrReceive1: // Lệnh
case SendOrReceive2: // Lệnh
case SendOrReceive3: // Lệnh
.......
default: // Lệnh
В этой статье мы узнаем, как использовать регистр по умолчанию, чтобы избежать взаимоблокировки. Но сначала давайте выясним, что такое случай взаимоблокировки при использовании команды select в Golang ?
Что нужно знать о случаях взаимоблокировки в Golang
Взаимная блокировка: когда вы пытаетесь прочитать или записать данные из канала, но канал пуст. Таким образом, он блокирует текущее выполнение горутины и передает управление другим горутинам, но если другие горутины недоступны или другие горутины отдыхают из-за этой ситуации, программа аварийно завершит работу. Это явление называется тупиком. Как показано в примере ниже:
Например:
// Chương trình Go minh hoạc
// cách deadlock phát sinh
package main
// Hàm chính
func main() {
// Tạo một kênh
// Deadlock phát sinh bởi
// không có goroutine đang viết
// vào kênh này, vì thế
// lệnh select đã bị khóa mãi mãi
c := make(chan int)
select {
case <-c: }="" }="">
Результат:
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan receive]:
main.main()
Чтобы избежать этой ситуации, мы используем регистр по умолчанию в операторе select. Другими словами, когда в программе возникает взаимоблокировка, выполняется вариант оператора select по умолчанию, чтобы избежать взаимоблокировки. Как и в примере ниже, мы используем регистр по умолчанию в операторе select, чтобы избежать взаимоблокировки.
Например:
// Chương trình Go minh họa cách giải quyết
// vấn đề deadlock bằng case mặc định
package main
import "fmt"
// Hàm chính
func main() {
// Tạo 1 kênh
c := make(chan int)
select {
case <-c: default:="" fmt.println("!..="" default="" case..!")="" }="" }="">
Результат:
!.. Default case..!
Вы также можете использовать случай по умолчанию, когда оператор select имеет только нулевой канал . Как показано в примере ниже, канал c равен нулю, поэтому выполняется вариант по умолчанию, если вариант по умолчанию здесь недоступен, то программа блокируется навсегда и возникает взаимоблокировка.
Например:
// Chương trình Go minh họa
// chạy case mặc định
package main
import "fmt"
// Hàm chính
func main() {
// Tạo một kênh
var c chan int
select {
case x1 := <-c: fmt.println("value:="" ",="" x1)="" default:="" fmt.println("default="" case..!")="" }="" }="">
Результат:
Default case..!