- channel不像文件一样需要经常去关闭,只有当你确实没有任何发送数据了,或者你想显示的结束range循环之类的,才去关闭channel。
- 关闭channel后,无法向channel再发送数据,(引发pannic错误后,导致接收立即返回零值)
- 关闭channel后,可以继续从channel中接收数据
- 对于nil channel,无论收发都会被阻塞。
如果没有close,会出现死锁。
package mainimport "fmt"func main() {c := make(chan int)go func() {for i := 0;i < 5;i++ {c <- i}//close 关闭一个 channel//close(c)}()for {//ok 如果为true,表示 channel 没有关闭,如果为false,表示channel已经关闭if data,ok := <-c; ok{fmt.Println(data)} else {break}}fmt.Println("Main Finished....")
}
加上close后
package mainimport "fmt"func main() {c := make(chan int)go func() {for i := 0;i < 5;i++ {c <- i}//close 关闭一个 channelclose(c)}()for {//ok 如果为true,表示 channel 没有关闭,如果为false,表示channel已经关闭if data,ok := <-c; ok{fmt.Println(data)} else {break}}fmt.Println("Main Finished....")
}
如果像关闭的channel发送数据,会报panic的错误,如下所示:
package mainimport "fmt"func main() {c := make(chan int)go func() {for i := 0;i < 5;i++ {c <- iclose(c)}//close 关闭一个 channel}()for {//ok 如果为true,表示 channel 没有关闭,如果为false,表示channel已经关闭if data,ok := <-c; ok{fmt.Println(data)} else {break}}fmt.Println("Main Finished....")
}