channel是golang中重要的组成部分。也是协程通信间通信的方式
channel常见理论面试题 channel 什么情况下会出现panic 试图往已close的channel继续发送 试图关闭已关闭的channel 试图关闭一个nil的channel 向为nil的channel发送数据会怎样 给定一个 nil channel c:
<-c 从 c 接收将永远阻塞
c <- v 发送值到 c 会永远阻塞
channel close后读的问题 关闭后继续读数据,已在缓冲区内的可以读取到数据,而后得到的是零值(对于int,就是0)。
我们可以通过for循环遍历channel,来获取到已经写入的值
1 2 3 for _, v := range channel{ } 对于可能获取到零值,我们可以使用断言判断,ok为false代表channel已关闭后读取的
1 value, ok := <- channel 也可以在close channel之后有意将channel 置为 nil, 如此再使用,并不会读取到零值
对于不带缓冲的ch,和带缓冲的一样,channel close掉之后并不影响读,只影响写入
channel底层源码剖析 go的运行时源码在runtime/chan.go文件下,可以在该文件下查看具体的数据结构,send(channel <-),receive(-> channel),close channel等操作
数据结构 1 2 3 4 5 6 7 8 9 10 11 12 type hchan struct { qcount uint // total data in the queue 代表 chan 中已经接收但还没被取走的元素的个数。内建函数 len 可以返回这个字段的值。 dataqsiz uint // size of the circular queue 循环队列的大小 buf unsafe....