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 分钟前
【C++】vector 类
开发语言·c++
_upupup12 分钟前
智能指针的原理及简单模拟实现(C++)
开发语言·c++
打工仔折腾 AI19 分钟前
飞牛OS上用Docker Compose部署ExerciseDiary运动记录并配置远程访问
运维·人工智能·后端·python·docker·容器·ai agent 实战
en.en..20 分钟前
C语言---宏
c语言·开发语言
郝学胜-神的一滴28 分钟前
C++ Templates 01:拨开迷雾,读懂C++模板经典著作
开发语言·c++·程序人生·游戏·游戏引擎·软件构建
小蒜学长31 分钟前
基于Python的动物救助站管理系统的设计与实现(代码+数据库+LW)
数据库·后端·python·django·动物救助
小小张说故事40 分钟前
Python 中 __new__ 和 __init__ 到底谁才是构造函数?一文讲透区别与 5 个坑
后端·python
言乐61 小时前
Python实现关税自动计算模型
开发语言·python·django·virtualenv·pygame
朝朝辞暮i1 小时前
C++ 第 14 课:引用 &
开发语言·c++·算法
用户847172102841 小时前
.shot 文件格式规范
前端·后端