go channel

channel

创建channel

可以通过make函数来创建channel,channel是引用类型,空值为nil

ch := make(chan int)

close channel

使用close函数关闭channel之后,后续的发送调用都会panic,后续的接收调用都会收到空值,可以用下面的语法判断channel是否被关闭。

value, ok := <- ch

使用for range语法可以自动判断channel是否已经关闭

func main() {
	naturals := make(chan int)
	squares := make(chan int)
	// Counter
	go func() {
		for x := 0; x < 100; x++ {
			naturals <- x
		}
		close(naturals)
	}()
	// Squarer
	go func() {
		for x := range naturals {
			squares <- x * x
		}
		close(squares)
	}()
	// Printer (in main goroutine)
	for x := range squares {
		fmt.Println(x)
	}
}

close一个已经close的channel,或者nil channel时,都会引起panic

channel复用

go中提供select语法,可以对channel进行复用。

func main() {
	ch := make(chan int, 1)
	for {
		select {
		case ch <- 0:
		case ch <- 1:
		}
		i := <-ch
		fmt.Println(i)
	}
}

select随机选择一个就绪的可读或者可写的channel执行,如果都没有就绪就会陷入等待,上面的代码会随机输出0和1的序列。

posted @   HachikoT  阅读(81)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
历史上的今天:
2019-12-10 为什么说switch比if快
点击右上角即可分享
微信分享提示