chan的一些注意事项,未关闭的单线程阻塞问题

2020-12-21  本文已影响0人  哆啦在这A梦在哪

定义

    cn := make(chan int)

关闭

close(cn)

放入值

    cn := make(chan int)
    cn <- 0:

取出值

    cn := make(chan int)
    res:=<-cn 

注意点1,关闭执行两次会异常

    cn := make(chan int)
    close(cn)
    close(cn)//这里异常

注意点2,向已经关闭的chan中发送,会异常,需要使用ok的形式判断

    cn := make(chan int)
    close(cn)
    cn <- 0://这里异常
//////////////////////////////////////////////
    可以用这个方法
    res,ok:=<-cn//如果已经关闭,ok为false

注意点3,向已经关闭的chan中获取值时,获取出的内容除了已经放入的,如果继续获取,将获取到对应类型的0值,可以用ok的形式

    cn := make(chan int,3)
    cn <- 3
    cn <- 4
    cn <- 5
    close(cn)
    t1:=<-cn//3
    t2:=<-cn//4
    t3:=<-cn//5
    t4:=<-cn//0,因为已经取空了,所以反馈对应int的0值,如果是字符串,那就是反馈""

注意,注意,注意,特别要注意的是这个,

    res,ok:=<-cn//如果已经关闭,ok为false,没有关闭,这句话就阻塞状态

这个方法当cn如果没有关闭的时候,而且cn中又没有值的时候,这句话是阻塞的
不能用ok直接处理未关闭的chan,使用单线程场景需要考虑

上一篇 下一篇

猜你喜欢

热点阅读