首頁 >後端開發 >Golang >為什麼我的Golang超時案例在使用通道時沒有觸發?

為什麼我的Golang超時案例在使用通道時沒有觸發?

Patricia Arquette
Patricia Arquette原創
2024-12-18 11:38:15817瀏覽

Why Doesn't My Golang Timeout Case Trigger When Using Channels?

在帶有 Channels 的 Golang 中未觸發超時情況

在提供的程式碼中,使用 select 語句和 time.After() 呼叫實作逾時情況。但是,超時情況並沒有被執行。

說明

原因是 time.After() 函數每次呼叫時都會建立一個新通道。當 select 語句從 c1 通道接收到值時(在第一個 for 迴圈中),現有的 time.After() 通道將會被丟棄。因此,超時情況永遠沒有機會接收值。

解決方案

要解決此問題,只需在 for 迴圈之外僅建立一次 time.After() 通道。這樣可以確保在整個執行過程中逾時案例使用相同的通道。

修改後的程式碼如下:

func main() {
    c1 := make(chan int, 1)

    go func() {
        for {
            time.Sleep(1500 * time.Millisecond)
            c1 <- 10
        }
    }()

    timeout := time.After(2000 * time.Millisecond)
    for {
        select {
        case i := <-c1:
            fmt.Println(i)
        case <-timeout:
            fmt.Println("TIMEOUT")
        }
    }

    fmt.Scanln()
}

透過此修改,逾時案例將在 2 秒後成功執行,只要在該時間範圍內沒有從 c1 通道接收到任何值。

以上是為什麼我的Golang超時案例在使用通道時沒有觸發?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn