簡體   English   中英

進入頻道:雖然不向頻道推送任何內容,但仍消耗頻道中的數據

[英]Go channel: consume data from channel although not push anything to channel

例如,我有以下代碼:

package main

import (
    "fmt"
)

func main() {

    c1 := make(chan interface{})
    close(c1)
    c2 := make(chan interface{})
    close(c2)

    var c1Count, c2Count int
    for i := 1000; i >= 0; i-- {
        select {
        case <-c1:
            c1Count++
        case <-c2:
            c2Count++
        }

    }
    fmt.Printf("c1Count: %d\nc2Count: %d\n  ", c1Count, c2Count)
}

運行時,輸出為:

c1Count: 513
c2Count: 488

我不知道的是:我們沒有做任何事情就創建了c1和c2通道。 為什么在select / case塊中,c1Count和c2Count可以增加值?

謝謝

Go編程語言規范

在調用close之后,並且在接收到任何先前發送的值之后,接收操作將返回通道類型的零值而不會阻塞。 多值接收操作返回接收值以及通道是否關閉的指示。


您正在計數零值。

例如,

package main

import (
    "fmt"
)

func main() {

    c1 := make(chan interface{})
    close(c1)
    c2 := make(chan interface{})
    close(c2)

    var c1Count, c2Count int
    var z1Count, z2Count int
    for i := 1000; i >= 0; i-- {
        select {
        case z1 := <-c1:
            c1Count++
            if z1 == nil {
                z1Count++
            }

        case z2 := <-c2:
            c2Count++
            if z2 == nil {
                z2Count++
            }
        }

    }
    fmt.Printf("c1Count: %d\nc2Count: %d\n", c1Count, c2Count)
    fmt.Printf("z1Count: %d\nz2Count: %d\n", z1Count, z2Count)
}

游樂場: https : //play.golang.org/p/tPRkqXrAFno

輸出:

c1Count: 511
c2Count: 490
z1Count: 511
z2Count: 490

Go編程語言規范

對於聲明

對於帶有范圍子句的語句

對於通道,所產生的迭代值是在通道上發送的連續值,直到關閉通道為止。 如果通道為nil,則范圍表達式將永遠阻塞。

對於帶range子句的for語句,關閉很有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM