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....")
}
相关推荐
代码游侠1 分钟前
学习笔记——栈
开发语言·数据结构·笔记·学习·算法
编程修仙7 分钟前
第七篇 java的注解以及使用反射实现自定义注解功能
xml·java·开发语言·spring
IT_陈寒15 分钟前
JavaScript 性能优化:7个 V8 引擎隐藏技巧让你的代码提速200%
前端·人工智能·后端
GesLuck20 分钟前
Beaglebone BB Black C版 AM3358(一)
c语言·开发语言·物联网·硬件架构
lusasky21 分钟前
Java内存堆栈AI分析工具全览
java·开发语言
CoderYanger22 分钟前
C.滑动窗口-越长越合法/求最短/最小——2904. 最短且字典序最小的美丽子字符串
java·开发语言·数据结构·算法·leetcode·1024程序员节
qq_124987075326 分钟前
基于springboot的糖业信息咨讯网站(源码+论文+部署+安装)
java·spring boot·后端·毕业设计·毕设
fanruitian30 分钟前
Springboot 示例模版
java·spring boot·后端
QQ_43766431432 分钟前
常见题目及答案
android·java·开发语言
hefaxiang35 分钟前
C语言数据类型和变量(上)
c语言·开发语言