首頁 > 後端開發 > Golang > go 通道的行為是否會根據訊息發送到它的方式而改變?

go 通道的行為是否會根據訊息發送到它的方式而改變?

WBOY
發布: 2024-02-09 10:39:20
轉載
791 人瀏覽過

go 通道的行为是否会根据消息发送到它的方式而改变?

php小編小新在go語言中,通道是用來在goroutine之間傳遞資料的機制。通道的行為取決於訊息發送到它的方式。當通道被宣告為有緩衝的時候,發送訊息的goroutine會將訊息放入通道的緩衝區,然後繼續執行。而當通道被宣告為無緩衝的時候,發送訊息的goroutine會阻塞,直到有其他goroutine從頻道接收訊息。因此,可以說通道的行為會根據訊息發送到它的方式而改變。

問題內容

為什麼這兩段程式碼的執行方式不同?

  1. 執行以下程式碼會回傳 fatal 錯誤:所有 goroutine 都在休眠 - 死鎖! error。
func main() {
    ch := make(chan int)
    ch <- 1
    fmt.println(<-ch)
}
登入後複製
  • 正確執行以下程式碼會回傳 2 和 3(各佔一行)。
  • ch := make(chan int)
        go buffer(ch)
        fmt.Println(<-ch)
        fmt.Println(<-ch)
    }
    
    func buffer(ch chan int) {
        ch <- 2
        ch <- 3
    }
    登入後複製

    僅當 ch 被定義為緩衝通道時,#1 才能正確執行。為什麼?為什麼 buffer() 中的 ch 接受 2 個值而不抱怨?

    解決方法

    對無緩衝通道的傳送操作將會阻塞,直到另一個 goroutine 從中讀取資料。這就是第一段程式碼死鎖的原因:當您傳送到通道時,沒有其他 goroutine 從中讀取。

    在第二種情況下,您有一個 goroutine 向通道發送兩個值,並且主 goroutine 在發送的同時從通道讀取兩次。該通道不接受兩次發送,而是一個接一個地進行,第一個發送操作由第一次讀取解除阻塞,第二個發送操作由第二次讀取解除阻塞。

    以上是go 通道的行為是否會根據訊息發送到它的方式而改變?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    相關標籤:
    來源:stackoverflow.com
    本網站聲明
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
    最新問題
    熱門教學
    更多>
    最新下載
    更多>
    網站特效
    網站源碼
    網站素材
    前端模板