Concurrency 为什么我要从封闭通道接收值?
我正在调查频道的行为,我对他们的行为感到困惑。在调用close之后,规范会说,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
,并且在收到之前发送的任何值之后,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