chan在go语言中相当于一个文件操作符,使用完成之后需要使用Close()函数关闭。
下面这段代码有两个chan,ch1是一个chan int类型,ch2是一个chan bool类型,ch1被write()函数写入10个数,被read()函数读取,ch2其实是为了防止main所在的goroutine提前退出用的。
func consumer(data chan int,done chan bool){
for{
fmt.Println("receive :",<-data)
}
done<-true
}
func produce(data chan int) {
for i := 0; i < 5; i++ {
data<-i
}
//close(data)
}
func main() {
data :=make(chan int)
done:=make(chan bool)
go consumer(data,done)
go produce(data)
<-done
}
这段代码是在producer处没有关闭通道的情况
从执行结果可以看到,当我们将10个数写完之后,如果不close()ch1,read就会阻塞,程序中所有的协程都被阻塞,ch2无法写入,也无法读取,系统这时候检测到这种错误就会报错。
当我们将producer中的close打