亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

Go基礎系列:nil channel用法示例

標簽:
Go

当未为channel分配内存时,channel就是nil channel,例如var ch1 chan int。nil channel会永远阻塞对该channel的读、写操作。

nil channel会阻塞对该channel的所有读、写。所以,可以将某个channel设置为nil,进行强制阻塞,对于select分支来说,就是强制禁用此分支。

以下是一个nil channel的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43package mainimport (    "fmt"
    "math/rand"
    "time")// 不断向channel c中发送[0,10)的随机数func send(c chan int) {    for {
        c <- rand.Intn(10)
    }
}func add(c chan int) {
    sum := 0

    // 1秒后,将向t.C通道发送时间点,使其可读
    t := time.NewTimer(1 * time.Second)    for {        // 一秒内,将一直选择第一个case
        // 一秒后,t.C可读,将选择第二个case
        // c变成nil channel后,两个case分支都将一直阻塞
        select {        case input := <-c:            // 不断读取c中的随机数据进行加总
            sum = sum + input        case <-t.C:
            c = nil
            fmt.Println(sum)
        }
    }
}func main() {
    c := make(chan int)    go add(c)    go send(c)    // 给3秒时间让前两个goroutine有足够时间运行
    time.Sleep(3 * time.Second)
}

上面的示例中,send()向通道c不断发送10以内的随机整数,add()则在一秒内不断读取通道c中的数据并进行加总。一秒时间到后,t.C通道就会有数据,第二个case分支就会被选中,第二个case会让第一个case评估的channel变为nil channel,使得第一个case从此永久禁用,因为第二个case没有多余的数据可读,它也被永久禁用。总共3秒之后,main goroutine结束,程序结束。

如果不理解NewTimer(d),换成After(d)是一样的,After(d)和NewTime(d).C是等价的。

1
2
3
4
5
6
7
8
9
10
11
12
13func add(c chan int) {
    sum := 0
    t := time.After(1 * time.Second)    for {        select {        case val := <-c:
            sum = sum + val        case <-t:
            c = nil
            fmt.Println(sum)
        }
    }
}

 

转载请注明出处:https://www.cnblogs.com/f-ck-need-u/p/9994508.html


點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
JAVA開發工程師
手記
粉絲
33
獲贊與收藏
208

關注作者,訂閱最新文章

閱讀免費教程

  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消