Golang调试时从channel提取数据遇到死锁错误怎么解决

Golang调试时从channel提取数据遇到死锁错误怎么解决 问题简述: 在尝试从通道中提取值时,我遇到了死锁。

详细描述:

ch1 := make(chan int, 100)

// 向通道放入10个值

使用以下代码时:

for value := <-ch1 {
  arr = append(arr,value)
}

我的程序会停滞,或者在调试时出现死锁错误。

但使用以下代码:

func ExtractChannel(ch chan int, maxSkip int) []int {
	skip := 0
	array := make([]int, 0)
	for skip < maxSkip {
		select {
		case c := <-ch:
			array = append(array, c)
		default:
			skip++
			time.Sleep(50 * time.Millisecond)
		}
	}

	return array
}

arr := ExtractChannel(ch1, 10)

一切工作正常。

我觉得我自己的写法有点过于复杂了。

可能问题在于,我创建通道时设置了100的容量:

ch1 := make(chan int, 100)

但在我的代码中,它只被放入了10个值。

对此有什么建议吗?


更多关于Golang调试时从channel提取数据遇到死锁错误怎么解决的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

从通道读取的 for 循环是一个阻塞操作,只有在通道关闭时才会退出。例如:

ch := make(chan int, 100)
arr := make([]int, 0, 0)

go func() {
    for i := range 10 {
        ch <- i
    }
    close(ch)
}()

for i := range ch {
    arr = append(arr, i)
}

更多关于Golang调试时从channel提取数据遇到死锁错误怎么解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


  • 关闭通道 是向接收者发出的信号,表示不再有值会发送过来。
  • 缓冲区大小(10010)在此处不影响正确性,只影响性能(以避免发送操作阻塞)。
  • 使用 select { … default: … } 通常用于非阻塞读取,而不是常规的排空操作。
回到顶部