W języku Go polecenie SELECT jest podobne do polecenia switch , ale w poleceniu SELECT polecenie case odnosi się do komunikacji, tj. wysyłania lub odbierania operacji na kanale.

Składnia:
select{
case SendOrReceive1: // Lệnh
case SendOrReceive2: // Lệnh
case SendOrReceive3: // Lệnh
.......
default: // Lệnh
W tym artykule dowiesz się, jak używać domyślnego przypadku, aby uniknąć impasu. Ale najpierw sprawdźmy, jaki jest przypadek impasu podczas korzystania z polecenia select w języku Go ?
Rzeczy, które należy wiedzieć o przypadku impasu w Golang
Blokada: sytuacja, w której próbujesz odczytać lub zapisać dane z kanału, ale kanał jest pusty. Blokuje więc bieżące wykonywanie gorutyny i przekazuje kontrolę innym gorutynom, ale jeśli żadna inna gorutyna nie jest dostępna lub inne gorutyny są w stanie spoczynku z powodu tej sytuacji, program ulegnie awarii. Zjawisko to nazywane jest impasiem. Jak pokazano w poniższym przykładzie:
Na przykład:
// 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: }="" }="">
Wynik:
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan receive]:
main.main()
Aby uniknąć tej sytuacji, w poleceniu SELECT stosujemy przypadek domyślny. Innymi słowy, gdy w programie wystąpi impas, wykonywany jest domyślny przypadek polecenia SELECT, aby uniknąć impasu. Podobnie jak w poniższym przykładzie, w poleceniu SELECT używamy przypadku domyślnego, aby uniknąć impasu.
Na przykład:
// 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..!")="" }="" }="">
Wynik:
!.. Default case..!
Można również użyć przypadku domyślnego, gdy polecenie SELECT ma tylko kanał nil . Jak pokazano w poniższym przykładzie, kanał c jest pusty, więc jeśli domyślny przypadek nie jest dostępny, wykonywany jest przypadek domyślny, program zostanie zablokowany na zawsze i nastąpi impas.
Na przykład:
// 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..!")="" }="" }="">
Wynik:
Default case..!