golang 如從一個通道(channel)接收資料時在預期時間沒接收到,可以使用select語句和time.After函式,來防止一直沒拿到資料導致協程一直阻塞

N神3發表於2024-08-01

在Go語言中,如果希望在從一個通道(channel)接收資料時設定超時,可以使用select語句和time.After函式。以下是一個示例程式碼,演示瞭如何實現這個功能:

package main
 
import (
    "fmt"
    "time"
)
 
func main() {
    // 建立一個通道
    ch := make(chan string)
 
    // 啟動一個goroutine,模擬資料生產,這裡延遲1秒
    go func() {
        time.Sleep(1 * time.Second)
        ch <- "資料"
    }()
 
    // 設定超時時間
    timeout := 500 * time.Millisecond
 
    // 使用select等待通道ch或超時
    select {
    case data := <-ch:
        fmt.Println("接收到資料:", data)
    case <-time.After(timeout):
        fmt.Println("超時,未接收到資料")
    }
}

在這個例子中,我們建立了一個通道ch,並且在主goroutine中使用select語句和time.After函式設定了一個超時。如果在指定的超時時間內從ch接收到資料,則執行第一個case並列印接收到的資料。如果超過設定的超時時間仍未接收到資料,則執行time.After對應的case,列印超時資訊。

相關文章