En el lenguaje Go, la declaración select es como la declaración switch , pero en la declaración select, la declaración case se refiere a la comunicación, es decir, la operación de envío o recepción en el canal.

Sintaxis:
select{
case SendOrReceive1: // Lệnh
case SendOrReceive2: // Lệnh
case SendOrReceive3: // Lệnh
.......
default: // Lệnh
En este artículo, aprenderemos cómo utilizar el caso predeterminado para evitar el bloqueo. Pero primero, descubramos qué es el caso de bloqueo cuando se usa el comando de selección de Golang .
Cosas que debe saber sobre el caso de estancamiento en Golang
Bloqueo: cuando intenta leer o escribir datos de un canal pero el canal está vacío. Por lo tanto, bloquea la ejecución actual de la goroutine y pasa el control a otras goroutines, pero si no hay otra goroutine disponible o si otras goroutines están en reposo debido a esta situación, el programa se bloqueará. Este fenómeno se llama punto muerto. Como se muestra en el siguiente ejemplo:
Por ejemplo:
// 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: }="" }="">
Resultado:
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan receive]:
main.main()
Para evitar esta situación, utilizamos el caso predeterminado en la declaración select. En otras palabras, cuando se produce un bloqueo en el programa, se ejecuta el caso predeterminado de la instrucción select para evitar el bloqueo. Como en el ejemplo a continuación, utilizamos el caso predeterminado en la declaración select para evitar el bloqueo.
Por ejemplo:
// 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..!")="" }="" }="">
Resultado:
!.. Default case..!
También se le permite utilizar el caso predeterminado cuando la declaración de selección solo tiene un canal nulo . Como se muestra en el ejemplo a continuación, el canal c es nulo, por lo que se ejecuta el caso predeterminado; si el caso predeterminado aquí no está disponible, el programa se bloqueará para siempre y se producirá un bloqueo.
Por ejemplo:
// 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..!")="" }="" }="">
Resultado:
Default case..!