chan不需要显示关闭(close),只要没有goroutine持有channel,相关资源会自动释放。
chan最好是发送端调用close,此时读取端会收到一个空消息,如下:
ch:=make(chan string,1)
go func(){
for{
i:=<-ch
if i==""{
fmt.Println("通道被close")
break
}else{
fmt.Println("收到消息:",i)
}
}
}()
for i:=0;i<5;i++ {
ch<-fmt.Sprintf("%d",i)
time.Sleep(time.Second)
}
close(ch)
---------------------------------------------------------
收到消息: 0
收到消息: 1
收到消息: 2
收到消息: 3
收到消息: 4
通道被close
向已经关闭的chan发送数据会抛异常,如下:
ch:=make(chan string,1)
close(ch)
ch<-"abc"
-----------------------------------
panic: send on closed channel