合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
# 管道 通道是引用类型,通道类型的空值是nil。 channel是一种类型,一种引用类型。声明通道类型的格式如下: ``` <pre class="calibre13">``` <span class="token2">var</span> 变量 chan 元素类型 ``` ``` ``` <pre class="calibre13">``` <span class="token2">var</span> ch1 chan int <span class="token6">// 声明一个传递整型的通道</span> <span class="token2">var</span> ch2 chan bool <span class="token6">// 声明一个传递布尔型的通道</span> <span class="token2">var</span> ch3 chan <span class="token1">[</span><span class="token1">]</span>int <span class="token6">// 声明一个传递int切片的通道</span> ``` ``` 声明的通道后需要使用make函数初始化之后才能使用。 创建channel的格式如下: ``` <pre class="calibre13">``` <span class="token3">make</span><span class="token1">(</span>chan 元素类型<span class="token1">,</span> <span class="token1">[</span>缓冲大小<span class="token1">]</span><span class="token1">)</span> ``` ``` channel的缓冲大小是可选的。 举几个例子: ``` <pre class="calibre13">``` ch4 <span class="token1">:</span><span class="token">=</span> <span class="token3">make</span><span class="token1">(</span>chan int<span class="token1">)</span> ch5 <span class="token1">:</span><span class="token">=</span> <span class="token3">make</span><span class="token1">(</span>chan bool<span class="token1">)</span> ch6 <span class="token1">:</span><span class="token">=</span> <span class="token3">make</span><span class="token1">(</span>chan <span class="token1">[</span><span class="token1">]</span>int<span class="token1">)</span> ``` ``` 通道有发送(send)、接收(receive)和关闭(close)三种操作。 发送和接收都使用<-符号。 使用无缓冲通道进行通信将导致发送和接收的goroutine同步化。因此,无缓冲通道也被称为同步通道。、 我们可以在使用make函数初始化通道的时候为其指定通道的容量,例如: ``` <pre class="calibre13">``` func <span class="token3">main</span><span class="token1">(</span><span class="token1">)</span> <span class="token1">{</span> ch <span class="token1">:</span><span class="token">=</span> <span class="token3">make</span><span class="token1">(</span>chan int<span class="token1">,</span> <span class="token5">1</span><span class="token1">)</span> <span class="token6">// 创建一个容量为1的有缓冲区通道</span> ch <span class="token"><</span><span class="token">-</span> <span class="token5">10</span> fmt<span class="token1">.</span><span class="token3">Println</span><span class="token1">(</span><span class="token4">"发送成功"</span><span class="token1">)</span> <span class="token1">}</span> ``` ``` 只要通道的容量大于零,那么该通道就是有缓冲的通道,通道的容量表示通道中能存放元素的数量。就像你小区的快递柜只有那么个多格子,格子满了就装不下了,就阻塞了,等到别人取走一个快递员就能往里面放一个。 我们可以使用内置的len函数获取通道内元素的数量,使用cap函数获取通道的容量,虽然我们很少会这么做。 可以通过内置的close()函数关闭channel(如果你的管道不往里存值或者取值的时候一定记得关闭管道)