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....")
}
相关推荐
小码哥_常5 小时前
别再被误导!try...catch性能大揭秘
后端
南境十里·墨染春水6 小时前
C++传记(面向对象)虚析构函数 纯虚函数 抽象类 final、override关键字
开发语言·c++·笔记·算法
无巧不成书02186 小时前
30分钟入门Java:从历史到Hello World的小白指南
java·开发语言
2301_797172756 小时前
基于C++的游戏引擎开发
开发语言·c++·算法
苍何7 小时前
30分钟用 Agent 搓出一家跨境网店,疯了
后端
ssshooter7 小时前
Tauri 2 iOS 开发避坑指南:文件保存、Dialog 和 Documents 目录的那些坑
前端·后端·ios
追逐时光者7 小时前
一个基于 .NET Core + Vue3 构建的开源全栈平台 Admin 系统
后端·.net
程序员飞哥7 小时前
90后大龄程序员失业4个月终于上岸了
后端·面试·程序员
比昨天多敲两行7 小时前
C++ 二叉搜索树
开发语言·c++·算法
Birdy_x8 小时前
接口自动化项目实战(1):requests请求封装
开发语言·前端·python