Go dilinde select ifadesi switch ifadesine benzer , ancak select ifadesinde case ifadesi kanalda haberleşmeyi, yani gönderme veya alma işlemini ifade eder.

Sözdizimi:
select{
case SendOrReceive1: // Lệnh
case SendOrReceive2: // Lệnh
case SendOrReceive3: // Lệnh
.......
default: // Lệnh
Bu yazımızda çıkmazdan kaçınmak için varsayılan durumun nasıl kullanılacağını öğreneceğiz. Ama önce Golang select komutunu kullanırken deadlock durumunun ne olduğunu öğrenelim .
Golang'daki çıkmaz dava hakkında bilinmesi gerekenler
Kilitlenme: Bir kanaldan veri okumaya veya yazmaya çalıştığınızda ancak kanal boş olduğunda. Bu sayede goroutine'in mevcut yürütülmesi engellenir ve kontrol diğer goroutine'lere aktarılır, ancak başka bir goroutine mevcut değilse veya bu durumdan dolayı diğer goroutine'ler dinlenme halindeyse program çöker. Bu olguya çıkmaz denir. Aşağıdaki örnekte görüldüğü gibi:
Örneğin:
// 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: }="" }="">
Sonuç:
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan receive]:
main.main()
Bu durumu önlemek için select ifadesinde varsayılan durumu kullanırız. Başka bir deyişle, programda bir çıkmaz oluştuğunda, çıkmazı önlemek için select ifadesinin varsayılan durumu çalıştırılır. Aşağıdaki örnekte olduğu gibi, çıkmaza girmemek için select ifadesinde varsayılan durumu kullanıyoruz.
Örneğin:
// 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..!")="" }="" }="">
Sonuç:
!.. Default case..!
Ayrıca, select ifadesinin yalnızca nil kanalı olduğunda varsayılan durumu kullanmanıza da izin verilir . Aşağıdaki örnekte görüldüğü gibi c kanalı nil olduğundan, burada varsayılan durum mevcut değilse varsayılan durum çalıştırılır, program sonsuza kadar bloke olur ve çıkmaza girilir.
Örneğin:
// 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..!")="" }="" }="">
Sonuç:
Default case..!