Golang 菜鳥教程

Golang 控制語句

Golang 函數(shù) & 方法

Golang 結(jié)構(gòu)體

Golang 切片 & 數(shù)組

Golang 字符串(String)

Golang 指針

Golang 接口

Golang 并發(fā)

Golang 異常(Error)

Golang 其他雜項

Go Select語句和deadlock死鎖

在Go語言中,select語句就像switch語句,但是在select語句中,case語句引用通信,即通道上的發(fā)送或接收操作。

語法:

select{
    case SendOrReceive1: // 語句
    case SendOrReceive2: // 語句
    case SendOrReceive3: // 語句
    .......
    default: // Statement
 }

在本文中,我們將學習如何使用默認情況來避免死鎖。但是首先,我們了解什么是deadlock?

死鎖:當您試圖從通道讀取或?qū)懭霐?shù)據(jù)但通道沒有值時。因此,它阻塞goroutine的當前執(zhí)行,并將控制傳遞給其他goroutine,但是如果沒有其他goroutine可用或其他goroutine睡眠,由于這種情況,程序?qū)⒈罎?。這種現(xiàn)象稱為死鎖。如下面的實例所示:

package main

func main() {

    //創(chuàng)建通道
    //出現(xiàn)死鎖是因為沒有g(shù)oroutine在寫
    //因此,select語句被永遠阻塞
    c := make(chan int)
    select {
    case <-c:
    }
}

輸出:

fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan receive]:
main.main()

為了避免這種情況,我們在select語句中使用默認case。換句話說,當程序中出現(xiàn)死鎖時,將執(zhí)行select語句的默認情況以避免死鎖。如下例所示,我們在select語句中使用默認情況以避免死鎖。

package main 
  
import "fmt"
  
func main() { 
  
    //創(chuàng)建通道
    c := make(chan int) 
    select { 
    case <-c: 
    default: 
        fmt.Println("!.. Default case..!") 
    } 
}

輸出:

!.. Default case..!

當select語句只有nil通道時,也允許使用默認情況。如下面的實例所示,通道c是nil,所以默認情況下執(zhí)行,如果這里的默認情況是不可用的,那么程序?qū)⒂肋h被阻塞,死鎖出現(xiàn)。

package main

import "fmt"

func main() {

    //創(chuàng)建通道
    var c chan int

    select {
    case x1 := <-c:
        fmt.Println("Value: ", x1)
    default:
        fmt.Println("Default case..!")
    }
}

輸出:

Default case..!
丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清