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倒计时截至塞入一个数据