Go语言中channel的基础知识

ck_god · · 2469 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

channel

goroutine运行在相同的地址空间,因此访问共享内存必须做好同步。goroutine 奉行通过通信来共享内存,而不是共享内存来通信

 

引⽤类型 channel CSP 模式的具体实现,用于多个 goroutine 通讯。其内部实现了同步,确保并发安全。

 channel类型

map类似,channel也一个对应make创建的底层数据结构的引用。

 

当我们复制一个channel或用于函数参数传递时,我们只是拷贝了一个channel引用,因此调用者何被调用者将引用同一个channel对象。和其它的引用类型一样,channel的零值也是nil

 

定义一个channel时,也需要定义发送到channel的值的类型。channel可以使用内置的make()函数来创建:

    make(chan Type) //等价于make(chan Type, 0)

    make(chan Type, capacity)

 

capacity= 0 时,channel 是无缓冲阻塞读写的,当capacity> 0 时,channel 有缓冲、是非阻塞的,直到写满 capacity个元素才阻塞写入。

 

channel通过操作符<-来接收和发送数据,发送和接收数据语法:

    channel <- value      //发送valuechannel

    <-channel             //接收并将其丢弃

    x := <-channel        //channel中接收数据,并赋值给x

    x, ok := <-channel    //功能同上,同时检查通道是否已关闭或者是否为空

 

默认情况下,channel接收和发送数据都是阻塞的,除非另一端已经准备好,这样就使得goroutine同步变的更加的简单,而不需要显式的lock



有疑问加站长微信联系(非本文作者)

本文来自:51CTO博客

感谢作者:ck_god

查看原文:Go语言中channel的基础知识

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2469 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传