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

qiqiyeshi 14天前 9

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 12天前
    引用 2
    不是你自己 close 的么?
  • zwpaper 12天前
    引用 3
    `close(ch)`

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

    你肯定会问为什么有时候会正常退出,因为在 close 之后,range ch 先执行,然后 main 退出,其它 ch <- i 没有被执行到
  • monkeyWie 12天前
    引用 4
    改一下:
    ```
    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 12天前
    引用 5
    这代码格式化我裂开了,还是直接贴链接吧: https://play.golang.org/p/kY32r_P92Gh
  • raaaaaar 12天前
    引用 6
    你不能保证两个循环谁先结束
  • araraloren 12天前
    引用 7
    这是自己都没搞懂代码逻辑。。
  • MajorAdam 12天前
    引用 8
    娜塔莉的头像
  • 楼主 qiqiyeshi 12天前
    引用 9
    @zwpaper 是的 确实是这样
  • 楼主 qiqiyeshi 12天前
    引用 10
    @monkeyWie 谢谢,这个解决了问题,我原来的测试代码写的其实是有问题的
  • 楼主 qiqiyeshi 12天前
    引用 11
    谢谢大家的分析!
  • 游客
    12
返回