简析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语言学习笔记、语法知识、技术要点和个人理解及实战

全部评论

相关推荐

我已成为0offer的糕手:别惯着,胆子都是练出来的,这里认怂了,那以后被裁应届被拖工资还敢抗争?
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务