golang并发----安全的关闭通道

在接收方从通道内拿到所有数据后发送一个done来通知发送方关闭channel

func worker(msg chan string, done chan bool) {
    for {
        select {
        case <-done:
            fmt.Println("Done.")
            close(msg)
            return
        default:
            msg<-"hello world."
            time.Sleep(500*time.Millisecond)
        }
    }
}

func main() {
    msg := make(chan string)
    done := make(chan bool)
    timeout := time.After(5 * time.Second)
    // 将done传入worker 如果main接收完成通知worker关闭msg
    // 如果从worker直接关闭 main会继续接收msg的零值
    // 如果在main直接关闭 worker会向关闭的channel发送引起panic
    go worker(msg, done)

    for {
        select {
        case m := <-msg:
            fmt.Println("recieved msg:", m)
        case <-timeout:
            done <- true
            time.Sleep(500 * time.Millisecond)
            return
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 点击查看原文 Web SDK 开发手册 SDK 概述 网易云信 SDK 为 Web 应用提供一个完善的 IM 系统...
    layjoy阅读 14,303评论 0 15
  • Chapter 8 Goroutines and Channels Go enable two styles of...
    SongLiang阅读 1,732评论 0 3
  • chapter1: 打了两个小时电话,叽叽歪歪一堆完,终于回到属于我一个人的时间里,一口气喝掉小半瓶酸奶味力娇酒,...
    古香如故阅读 216评论 0 0
  • 1.个人理解react就像.net mvc里的view,但实则不是。又有点像component开发,就是把任何控件...
    ksh14阅读 145评论 0 0
  • 思来悲秋皆自扰,落叶何曾少。不甘零落挂树梢,奈何寒意日劲风萧萧。 去留随意莫空劳,飘零也逍遥。任由入泥颜色消,却喜...
    花甲日记阅读 382评论 3 10

友情链接更多精彩内容