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
- 关闭通道 是向接收者发出的信号,表示不再有值会发送过来。
- 缓冲区大小(
100与10)在此处不影响正确性,只影响性能(以避免发送操作阻塞)。 - 使用
select { … default: … }通常用于非阻塞读取,而不是常规的排空操作。

