1channel
goroutine运行在相同的地址空间,因此访问共享内存必须做好同步。goroutine奉行通过通信来
[点击并拖拽以移动]
共享内存,而不是共享内存来通信。
[点击并拖拽以移动]
[点击并拖拽以移动]
引用类型channel 是CSP模式的具体实现,用于多个goroutine通信。其内部实现了同步,确保并
[点击并拖拽以移动]
发安全。
[点击并拖拽以移动]
2channel 类型
和map类似,channel也是一个对应make创建的底层数据结构的引用。
[点击并拖拽以移动]
当我们复制一个channel或用于函数参数传递时,我们只是拷贝了channel引用,因此调用者和被调用
[点击并拖拽以移动]
者将引用同一个chanenl对象。channel默认值nil。
[点击并拖拽以移动]
定义一个channel时,也需要定义发送到channel值的类型。channel可以使用内置的make()函数来
创建:
make( chan Type)//等价于make(chan Type,0)
make(chan type,capacity)
当capacity=0时,channel是无缓冲阻塞读写的,当capacity>0时,channel有缓冲、是非阻塞的
[点击并拖拽以移动]
直到写满capacity个元素才阻塞写入。
[点击并拖拽以移动]
[点击并拖拽以移动]
3channel操作
channel通过<-来接收和发送数据,发送和接收的语法如下:
[点击并拖拽以移动]
channel<- value //发送value到channel
[点击并拖拽以移动]
<-channel //接收并将其丢弃
x:=<-channel //从channel中接收数据,并赋值给x
x,ok:=<-channel //功能上同上,同时检查通道是否关闭或者是否为空
默认情况下,channel接收和发送数据都是阻塞的,除非另一端已经准备好,这样就使得goroutine同步
变的更加简单,而不需要显式的lock。