channel
channel原理
一个通道相当于一个先进先出(FIFO)的队列。也就是说,通道中的各个元素值都是严格地按照发送的顺序排列的,先被发送通道的元素值一定会先被接收。元素值的发送和接收都需要用到操作符<-。我们也可以叫它接送操作符。一个左尖括号紧接着一个减号形象地代表了元素值的传输方向。
从通道中接收值的时候 <- 写在通道变量的左边,用于表达从该通道中接收一个元素值
对通道的发送和接收操作都有哪些基本的特性?
对于同一个通道,发送操作之间是互斥的,接收操作之间也是互斥的。同一个通道,发送和接收不互斥。前提是同一个数据已经被完全复制或读出chan(不能忽略chan复制、删除数据的时间)
发送操作和接收操作中对元素值的处理都是不可分割的。
发送操作在完全完成之前会被阻塞。接收操作也是如此。
发送操作和接收操作在什么时候可能被长时间的阻塞?
缓冲通道:
非缓冲通道:
有哪些特性?
给一个 nil channel 发送数据,造成永远阻塞
从一个 nil channel 接收数据,造成永远阻塞
给一个已经关闭的 channel 发送数据,引起 panic
从一个已经关闭的 channel 接收数据,如果缓冲区中为空,则返回一个零值
无缓冲的channel是同步的,而有缓冲的channel是非同步的
channel的实现原理?答了环形队列,被追问为什么用环形队列
channel使用场景
channel实现排序
channel和锁对比一下
channel和共享内存有什么优劣势?
分布式锁知道哪些?用channel如何实现?
集群用channel如何实现分布式锁
channel关闭以后,再往其发送或接收,会发生什么
发送报错
可以接收,为空时,取到的值是0;
怎么判断已经关闭,怎么判断关闭后有值?
a, ok := <-ch 判断;
channel 为空并且已经关闭,ok 参数才为false。
Golang中关闭管道channel需要注意的问题
当执行了 close(ch) ,那么就不能向 管道发送信息了,但是在关闭之前留在管道里面的消息还可以 被消费。
当之前的消息被消费完了,那么继续消费不会阻塞了,而是返回零值
巧妙使用channel实现限流器
https://studygolang.com/articles/28566?fr=sidebar
用Go语言实现一个简单生产者消费者模型,你是如何实现的
https://studygolang.com/articles/35421