赞
踩
当我们使用make内置函数创建channel时,channel可以是非缓冲的,也可以是缓冲的。与这个话题相关,有两个错误经常发生:对该使用哪种channel感到困惑;如果使用缓冲channel,使用缓冲区大小是多少的。让我们检查一下这些要点。首选,要记住核心概念。非缓冲channel是没有任何容量的channel,它可以省略大小或以0大小来创建:
- ch1 := make(chan int)
- ch2 := make(chan int, 0)
使用非缓冲channel(有时将其称为同步 channel),发送者将阻塞,直到接收者从channel接收到数据。缓冲channel是有容量的,它必须以大于或等于1的大小创建:
ch3 := make(chan int,1)
使用缓冲channel,发送者可以在channel未满时发送消息。一旦channel已满,它将阻塞,直到接收者goroutine收到消息。例如:
- ch3 := make(chan int, 1)
- ch3 <-1
- ch3 <-2
第一个发送没有阻塞,而第二个发送会阻塞,因为这个时候channel已经满了。
下面让我们来讨论这两种channel类型的根本区别。channel是实现goroutine之间通信的并发抽象。但是同步呢?在并发中,同步意味着我们可以保证多个goroutine在某个时刻处于已知状态。例如,互斥锁提供同步,因为它确保在一个时刻只有一个goroutine处于临界区。至于channe
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。