Go 通道:从通道中消费数据,但不向通道推送任何内容

Posted

技术标签:

【中文标题】Go 通道:从通道中消费数据,但不向通道推送任何内容【英文标题】:Go channel: consume data from channel although not push anything to channel 【发布时间】:2019-06-13 10:15:16 【问题描述】:

例如我有这个代码:

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 可以增加值?

谢谢

【问题讨论】:

【参考方案1】:

The Go Programming Language Specification

Close

在调用 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

The Go Programming Language Specification

For statements

对于带有范围子句的语句

对于通道,产生的迭代值是连续值 在通道上发送,直到通道关闭。如果频道是 nil,范围表达式永远阻塞。

Close 对于带有范围子句的 for 语句很有用。

【讨论】:

明白。那么我们为什么会使用关闭通道模式的原因对吗? 还有一个问题:两种方法有什么区别:一种是使用关闭通道模式(创建关闭通道,在循环外,完成后,我们将消息推送到此关闭通道)。一种是直接在 select/case 块内检查 (case value, ok := &lt;-c1:) 在有用时使用close 频道。请参阅我修改后的答案。 见***.com/questions/8593645/…

以上是关于Go 通道:从通道中消费数据,但不向通道推送任何内容的主要内容,如果未能解决你的问题,请参考以下文章

Go语言编程:使用条件变量Cond和channel通道实现多个生产者和消费者模型

令人困惑的是,Go Routines 的通道内是啥 [关闭]

[GO]通道的关闭

WP7 推送通知通道数限制

七天入门Go语言 通道 & Goroutine | 第四天 并发编程

Go笔记(十四):通道 channel