继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Go语言中channel的基础知识

holdtom
关注TA
已关注
手记 1845
粉丝 240
获赞 991


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      //发送value到channel

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

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

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

 

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

©著作权归作者所有:来自51CTO博客作者ck_god的原创作品,如需转载,请注明出处,否则将追究法律责任


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP