首頁 > 後端開發 > Golang > 為什麼關閉的Go Channel還能收到數值?

為什麼關閉的Go Channel還能收到數值?

DDD
發布: 2024-12-09 17:42:12
原創
435 人瀏覽過

Why Can I Still Receive Values from a Closed Go Channel?

為什麼可以從封閉的 Channel 接收值

在 Go 中,channel 提供了 goroutine 之間的通訊機制。當通道關閉時,表示不再發送任何值。但是,這並不意味著通道緩衝區中的現有值會立即被丟棄。

規範規定,關閉通道後,在收到零值之前仍然可以接收任何先前發送的值。這是因為通道的緩衝區充當佇列,儲存關閉操作之前發送的值。

工作原理:

考慮以下程式碼:

package main

import "fmt"
import "sync"
import "time"

func main() {
    iCh := make(chan int, 99)
    var wg sync.WaitGroup
    go func() {
        for i := 0; i < 5; i++ {
            wg.Add(1)
            go func(i int) {
                defer wg.Done()
                iCh <- i
            }(i)
        }
        wg.Wait()
        close(iCh)
    }()
    time.Sleep(5 * time.Second)
    for i := range iCh {
        fmt.Printf("%v\n", i)
    }
}
登入後複製

輸出:

0
1
2
3
4
登入後複製

即使通道關閉後5秒後,for循環仍然收到關閉操作之前發送的5個值。這是因為通道緩衝區會儲存這些值直到它們被消耗。

只有在接收到所有先前發送的值後,for 迴圈才會傳回零值,表示通道已關閉。

為什麼「Time.Sleep」技巧失敗:

「time.Sleep」技巧並不能阻止goroutine 在通道關閉之前繼續向通道發送值。當 goroutine 休眠 5 秒時,它們可能會發送額外的值,這些值仍會被 for 迴圈緩衝和接收。

以上是為什麼關閉的Go Channel還能收到數值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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