溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

golang中select實(shí)現(xiàn)非阻塞及超時(shí)控制

發(fā)布時(shí)間:2020-08-05 20:22:06 來(lái)源:網(wǎng)絡(luò) 閱讀:2762 作者:PowerMichael 欄目:編程語(yǔ)言
// select.go
package main

import (
    "fmt"
    "time"

    //"time"
)

func main() {
    //聲明一個(gè)channel
    ch := make(chan int)

    //聲明一個(gè)匿名函數(shù),傳入一個(gè)參數(shù)整型channel類型ch
    go func(ch chan int) {
        ch <- 1
        //往channel寫入一個(gè)數(shù)據(jù),此時(shí)阻塞
    }(ch)

    //由于goroutine執(zhí)行太快,先讓它sleep 1秒
    time.Sleep(time.Second)

    select {
    //讀取ch,解除阻塞
    case <-ch:
        fmt.Print("come to read ch!")
    default:
        fmt.Print("come to default!")
    }
}

// select.go
//整型channel類型ch一直處于讀取狀態(tài),所以處于阻塞,使用select實(shí)現(xiàn)超時(shí)控制
package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan int)
    //buffer channel,1個(gè)元素前非阻塞
    timeout := make(chan int, 1)

    go func() {
        time.Sleep(time.Second)
        //寫channel
        timeout <- 1
    }()

    select {
    //讀channel
    case <-ch:
        fmt.Print("come to read ch!")
        //沒有讀到channel,實(shí)現(xiàn)超時(shí)控制
    case <-timeout:
        fmt.Print("come to timeout!")
    }

    fmt.Print("end of code!")
}

// select.go
//使用time.After實(shí)現(xiàn)超時(shí)控制
package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan int)

    select {
    case <-ch:
        fmt.Print("come to read ch!")
    case <-time.After(time.Second):
        fmt.Print("come to timeout!")
    }

    fmt.Print("end of code!")
}
向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI