热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

channel用法和源码

源码分析https:mp.weixin.qq.comseCwZMwGjU2yoXu6K2nGF3g 1当chan用close关闭时,无论是有缓存的还是无缓存的,返回已缓冲数据或零值

源码分析https://mp.weixin.qq.com/s/eCwZMwGjU2yoXu6K2nGF3g

 

1 当chan用close关闭时,无论是有缓存的还是无缓存的,返回已缓冲数据或零值,如果重复用close关闭chan或对关闭的chan写入值都会报错,

https://blog.csdn.net/qq_41065919/article/details/107729571

https://www.cnblogs.com/pluse/p/12167537.html

struct{}类型好像只有一种具体实例即struct{}{},chan中如果有这种类型,只能写入它的零值struct{}{},所以类型为struct{}的chan无论是写入还是读出都时零值,

func main()  {
    m := make(chan struct{}, 1)
    // 从空的m中一直读取值会一直阻塞,所以会报死锁的错误,all goroutines are asleep - deadlock!
    //b := <- m
    //fmt.Println(b)
    // 如果这里就关闭了协程,下面会直接输出chan中的零值,而不会走default,
    //close(m)
    //m <- struct{}{}
    go func() {
        for{
            select {
            case a := <- m:
                fmt.Println(a)
                time.Sleep(time.Second)
            default:
                fmt.Println("chan为空,读取的时候会阻塞")
                time.Sleep(time.Second)
            }
        }
    }()
    // 加这个是为了主协程等待里面的子协程,否则的话主协程直接执行完了,观察不到子协程的具体输出,
    time.Sleep(time.Second * 5)
}
View Code
推荐阅读
author-avatar
手机用户2502916831
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有