通道channel问题

图片描述

为啥绿色区域还是可以获取到数据,红色区域就不可以了?

阅读 2.6k
3 个回答

channel关闭后可以读取关闭前写入的数据,关闭后不能写,写了就panic

clipboard.png
这里写了两个数据到a channel中,所以下面可以读两次,第3次不能读取了,因为没数据了

func main() {
    a := make(chan int, 5)
    b := make(chan bool, 1)
    go func() {
        for {
            k, v := <-a
            if v {
                fmt.Println("receive:", k)
            } else {
                fmt.Println("receive all")
                b <- true
                return
            }
        }
    }()
    for i := 1; i < 3; i++ {
        a <- i
    }
    close(a)
    kkkk := <-a
    nnnn := <-a
    msg := <-b
    kkkkk := <-a
    fmt.Println(kkkk, nnnn, msg, kkkkk)
}

输出

receive all
1 2 true 0

输出了4个值,证明kkkkk := <-a读到了值,看不懂你的评论

b通道接收之前,获取的数据是a<-i传入的,在b通过接受后,由于go func里面的for已经执行过了,也就是将a通道内容循环全部输出了,所以在b通过之后无法获取a通道的内容(因为已经全部在go func里面获取了)

新手上路,请多包涵

最后 执行 kkkkk := <-a
其实完整写法 应该是 kkkkk,ok := <-a

你最后执行的 结果应该是 kkkkk = 0 ok = false 吧 虽然打出kkkkk 是0 但是 ok 是false 说明 管道已经关闭 kkkkk 数据不可信是默认的初始值

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题