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