跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 大佬帮看一下代码,为什么会偶尔报错 panic: send on closed channel
未分類
9 9 月 2020

大佬帮看一下代码,为什么会偶尔报错 panic: send on closed channel

大佬帮看一下代码,为什么会偶尔报错 panic: send on closed channel

資深大佬 : qiqiyeshi 2

func main() {  ch := make(chan int)   for i := 0; i < 5; i++ {    i := i   go func() {    ch <- i    close(ch)   }()   }   for c := range ch {   println(c)  }   } 

大佬有話說 (10)

  • 資深大佬 : 996635

    不是你自己 close 的么?

  • 資深大佬 : zwpaper

    `close(ch)`

    你关了 5 次 ch,看 6 个 Goroutine 的调度顺序,只要有 一个 ch <- i 在 close 之后执行,就 panic

    你肯定会问为什么有时候会正常退出,因为在 close 之后,range ch 先执行,然后 main 退出,其它 ch <- i 没有被执行到

  • 資深大佬 : monkeyWie

    改一下:
    “`
    func main() {
    ch := make(chan int)
    var wg sync.WaitGroup
    wg.Add(5)
    go func() {
    wg.Wait()
    close(ch)
    }()

    for i := 0; i < 5; i++ {

    i := i
    go func() {
    ch <- i
    wg.Done()
    }()

    }

    for c := range ch {
    println(c)
    }
    }
    “`

  • 資深大佬 : monkeyWie

    这代码格式化我裂开了,还是直接贴链接吧: https://play.golang.org/p/kY32r_P92Gh

  • 資深大佬 : raaaaaar

    你不能保证两个循环谁先结束

  • 資深大佬 : araraloren

    这是自己都没搞懂代码逻辑。。

  • 資深大佬 : MajorAdam

    娜塔莉的头像

  • 主 資深大佬 : qiqiyeshi

    @zwpaper 是的 确实是这样

  • 主 資深大佬 : qiqiyeshi

    @monkeyWie 谢谢,这个解决了问题,我原来的测试代码写的其实是有问题的

  • 主 資深大佬 : qiqiyeshi

    谢谢大家的分析!

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具