Nel linguaggio Go, l'istruzione select è come l'istruzione switch , ma nell'istruzione select, l'istruzione case si riferisce alla comunicazione, ovvero all'operazione di invio o ricezione sul canale.

Sintassi:
select{
case SendOrReceive1: // Lệnh
case SendOrReceive2: // Lệnh
case SendOrReceive3: // Lệnh
.......
default: // Lệnh
In questo articolo impareremo come utilizzare il caso predefinito per evitare situazioni di stallo. Ma prima scopriamo cos'è il caso di deadlock quando si utilizza il comando select di Golang ?
Cose da sapere sul caso di stallo a Golang
Deadlock: quando si tenta di leggere o scrivere dati da un canale ma il canale è vuoto. Quindi blocca l'esecuzione corrente della goroutine e passa il controllo ad altre goroutine, ma se non è disponibile nessun'altra goroutine o se altre goroutine sono inattive a causa di questa situazione, il programma si bloccherà. Questo fenomeno è chiamato stallo. Come mostrato nell'esempio seguente:
Per esempio:
// 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: }="" }="">
Risultato:
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan receive]:
main.main()
Per evitare questa situazione, utilizziamo il caso predefinito nell'istruzione select. In altre parole, quando si verifica un deadlock nel programma, viene eseguito il caso predefinito dell'istruzione select per evitare il deadlock. Come nell'esempio seguente, utilizziamo il caso predefinito nell'istruzione select per evitare il deadlock.
Per esempio:
// 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..!")="" }="" }="">
Risultato:
!.. Default case..!
È anche consentito utilizzare il caso predefinito quando l' istruzione select ha solo un canale nil . Come mostrato nell'esempio seguente, il canale c è nil, quindi viene eseguito il caso predefinito; se il caso predefinito qui non è disponibile, il programma si bloccherà per sempre e si verificherà un deadlock.
Per esempio:
// 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..!")="" }="" }="">
Risultato:
Default case..!