Golang的channel及其底层剖析

make(chan int ,0) make(chan int )
这种情况要写一个go协程接收数据,才能将数据放到chan中

不要通过共享内存的方式进行通信 在函数传入一个指针类型,一直查看他所指的值 此时不断查询值是否改变
而是应该通过通信的方式共享内存 此时是卡在chan之前等待,效率大大提高

xx环形结构,减轻GC的压力
closed代表chan开启或者关闭
Mutex,加数据和取数据的一瞬间加锁,并不是一直加,所以chan效率还是可以的

<-没有意义,语法糖,也就是编译后会转化为其他的方法
如果发送前有协程在队列等待接收,直接唤醒协程即可
sudog是把g简单包装了一下

接收队列为空时,写的数据放到缓存中,维护下缓存的索引
发送时先看有无接收协程,然后放buf,满的话放send休眠队列

接收时 <-c 调用receive1
i ,ok<-调用receive2 最后都是调用receive

gp 协程的信息
判断队列是否为空,看缓存,拿走一个,把队列协程唤醒放到缓存
发送队列没东西,buf没东西,把自己包装为sudog放到接收队列等待接收
唤醒后不用担心数据的问题,直接返回即可,数据已经被拿走或者已经从本地得到了

<- 永远是阻塞的
而用select可以实现非阻塞接收
make(chan int)往里发数据是发不进去的,要阻塞

t.C倒计时截至塞入一个数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值