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 分钟前
面试官微笑发问:第100万页怎么查?我差点当场沉默…
后端·mysql·面试
zhangfeng11337 分钟前
R 语法高亮为什么没有,是需要安装专用的编辑软件,R语言自带的R-gui 功能还是比较简单
开发语言·r语言
qq_1728055926 分钟前
Go 装饰器模式学习文档
学习·golang·装饰器模式
文心快码BaiduComate27 分钟前
文心快码升级至3.5S版本,强化多智能体自协同能力
前端·后端·程序员
chao1898441 小时前
基于MATLAB的线性判别分析(LDA)人脸识别实现
开发语言·matlab
即兴小索奇1 小时前
Google AI Mode 颠覆传统搜索方式,它是有很大可能的
前端·后端·架构
kyle~1 小时前
排序---快速排序(Quick Sort)
java·开发语言
LucianaiB1 小时前
我用LazyLLM做了一个打工人述职Agent,朋友直呼打工人的福利,太完美了
后端
刘梓谦1 小时前
如何在Qt中使用周立功USB转CAN卡
开发语言·qt·zlg·周立功