简析go语言channel

channel是go语言中一种重要的并发原语:既可以实现goroutine之间的通信,又可以实现goroutine之间的同步。

可以像使用普通变量那样使用channel:定义channel类型变量,为channel类型变量赋值,将channel作为参数传递给函数/方法,将channel作为返回值从函数/方法中返回,甚至将channel原语发送到其他channel中。

c := make(chan int)  // 创建一个无缓冲(unbuffered)的int类型的channel
c := make(chan int, 5)  // 创建一个带传冲的int类型的channel
c <- x  // 向channel c发送一个值
<- c  // 从channel c中接收一个值
x = <- c  // 从channel c接收一个值并将值存储到变量x中
x, ok = <- c // 从channel c接收一个值并将值存储到变量x中,若channel关闭了,ok将被置为false
for i := range c // 将for ... range和channel结合使用
close(c)  // 关闭channel
c := make(chan chan int)  // 创建一个无缓冲的chan, int类型的channel
func stream(ctx context.Context, out chan<- Value) error  // 将只发送channel作为函数参数
func spwan(...) <- chan T // 将只接收类型channel作为返回值

当需要同时对多个channel进行操作时,结合使用Go为CSP模型提供的另一个原语select。通过select可以同时在多个channel上进行发送/接收操作:

select {
	case x := <- c:  // 从channel c接收数据
		...
	case y, ok := <- c:  // 从channel c接收数据并判断c是否已经关闭
		...
	case c <- z:  // 将z的值发送到channel c中
		...
	default:  // 当上面case中的channel均无法实施时,执行默认操作
		...
}

Go语言基础及实战 文章被收录于专栏

Go语言学习笔记、语法知识、技术要点和个人理解及实战

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-09 12:05
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-07 11:30
仁者伍敌:kpi都懒得刷了属于是
点赞 评论 收藏
分享
仁者伍敌:牛子这些人还会点一个自动回复,boss都不带回复的
点赞 评论 收藏
分享
Lorn的意义:你这标个前端是想找全栈吗?而且项目确实没什么含金量,技术栈太少了,边沉淀边找吧 现在学院本想就业好一点四年至少得高三模式两年加油吧
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-07 18:05
哈哈哈哈哈感觉朋友找工作的已经疯掉了,直接上图
码农索隆:真老板娘:“我嘞个去,这不我当年的套路吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务