5.9 go channel

 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。

 

 
发布了134 篇原创文章 · 获赞 104 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/h4241778/article/details/105374289