ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

go语言(二十一)---- channel的关闭

2026/9/12 10:14:50 拓冰建站 浏览量
go语言(二十一)---- channel的关闭
  1. channel不像文件一样需要经常去关闭,只有当你确实没有任何发送数据了,或者你想显示的结束range循环之类的,才去关闭channel。
  2. 关闭channel后,无法向channel再发送数据,(引发pannic错误后,导致接收立即返回零值)
  3. 关闭channel后,可以继续从channel中接收数据
  4. 对于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....")
}

在这里插入图片描述