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

  1. channel不像文件一样需要经常去关闭,只有当你确实没有任何发送数据了,或者你想显示的结束range循环之类的,才去关闭channel。
  2. 关闭channel后,无法向channel再发送数据,(引发pannic错误后,导致接收立即返回零值)
  3. 关闭channel后,可以继续从channel中接收数据
  4. 对于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....")
}
相关推荐
程序员天天困2 分钟前
Arthas trace 命令怎么用?一行定位最慢那行代码
jvm·后端
Huiturn3 分钟前
GPT 5.6 连续编码 10 小时,纯 Python 啃下 Word 二进制格式——doc2docx 实现拆解
后端
-银雾鸢尾-8 分钟前
C#中的泛型约束
开发语言·c#
用户298698530149 分钟前
Python 实现 Excel 与 Markdown 互转的实用指南
后端·python·excel
用户772831049084011 分钟前
krono-job:零侵入、单二进制交付的分布式任务调度平台(开源)
后端
Conan在掘金18 分钟前
鸿蒙报错速查:Function lacks ending return statement,返回路径漏 return 就炸,根因 + 真解法
后端
雪碧透心凉_38 分钟前
while 循环与循环嵌套
开发语言·python
人间凡尔赛44 分钟前
AI-Native 云原生架构:2026 年从容器编排到智能体编排的范式革命
后端·云原生·架构
乐观勇敢坚强的老彭1 小时前
信奥C++一维数组笔记
开发语言·c++·笔记
这就是佬们吗1 小时前
Python入门⑤-异常处理、文件操作与实战项目
开发语言·数据库·python·算法·pycharm