Concurrency 为什么我要从封闭通道接收值?

Concurrency 为什么我要从封闭通道接收值?,concurrency,go,Concurrency,Go,我正在调查频道的行为,我对他们的行为感到困惑。在调用close之后,规范会说,,并且在收到之前发送的任何值之后,receive操作将返回通道类型的零值,而不会阻塞。但是,即使此时通道已关闭,我似乎仍会在range语句中获得值。为什么呢 package main import "fmt" import "sync" import "time" func main() { iCh := make(chan int, 99) var wg sync.WaitGroup go

我正在调查频道的行为,我对他们的行为感到困惑。在调用close之后,规范会说,
,并且在收到之前发送的任何值之后,receive操作将返回通道类型的零值,而不会阻塞。
但是,即使此时通道已关闭,我似乎仍会在range语句中获得值。为什么呢

package main

import "fmt"
import "sync"
import "time"

func main() {
    iCh := make(chan int, 99)
    var wg sync.WaitGroup
    go func() {
        for i := 0; i < 5; i++ {
            wg.Add(1)
            go func(i int) {
                defer wg.Done()
                iCh <- i
            }(i)

        }
        wg.Wait()
        close(iCh)
    }()
    time.Sleep(5 * time.Second)
    print("the channel should be closed by now\n")
    for i := range iCh {
        fmt.Printf("%v\n", i)
    }
    print("done")
}
主程序包
输入“fmt”
导入“同步”
导入“时间”
func main(){
iCh:=制造(成龙国际,99)
var wg sync.WaitGroup
go func(){
对于i:=0;i<5;i++{
工作组.添加(1)
go func(i int){
推迟工作组完成()
脑出血

对于通道c,内置函数close(c)不再记录 值将在通道上发送。 在调用close之后,以及在之前发送的任何值被 received,receive操作将返回 没有阻塞的通道类型

在通道缓冲区中,有5个先前发送的值,后跟一个关闭

比如说,

package main

import (
    "fmt"
    "sync"
    "time"
)

func main() {
    iCh := make(chan int, 99)
    var wg sync.WaitGroup
    go func() {
        for i := 0; i < 5; i++ {
            wg.Add(1)
            go func(i int) {
                defer wg.Done()
                iCh <- i
            }(i)

        }
        wg.Wait()
        close(iCh)
    }()

    time.Sleep(5 * time.Second)
    fmt.Println("previously sent values", len(iCh))
    for i := range iCh {
        fmt.Printf("%v\n", i)
    }
    print("the channel should be closed by now\n")
    print("done")
}

您直接引用回答您问题的文档?“…在收到之前发送的任何值之后…”顺便说一句,我怀疑当你将关闭goroutines恐慌写入一个封闭通道时。@DaveC问题实际上是当我测试它时,我没有时间。睡眠,所以基本上我只是从封闭通道读取,因为go例程没有时间发送任何值。
previously sent values 5
0
1
2
3
4
the channel should be closed by now
done