Go语言使用通道在goroutine间传数据出现死锁问题求助
问题分析与修复
核心问题
- 通道隔离导致死锁:
generateNumbers内部新建了未共享的通道,发送数据时无接收方,goroutine永久阻塞,触发死锁。 - 未处理通道数据:
printNumbers未读取通道内容,也未响应通道关闭信号,无法完成数据接收逻辑。 - 格式化字符串错误:
fmt.Printf缺少占位符,导致输出无效提示信息。
修复后的代码
package main import ( "fmt" "sync" ) func generateNumbers(total int, wg *sync.WaitGroup, ch chan int) { defer wg.Done() sum := 0 for idx := 1; idx <= total; idx++ { fmt.Printf("Generating number %d\n", idx) sum += idx ch <- sum } close(ch) // 发送完成后关闭通道,通知接收方停止等待 } func printNumbers(wg *sync.WaitGroup, ch chan int) { defer wg.Done() // 循环接收通道数据,通道关闭后自动退出循环 for sum := range ch { fmt.Printf("Sum is now: %d\n", sum) } } func main() { var wg sync.WaitGroup ch1 := make(chan int) wg.Add(2) go printNumbers(&wg, ch1) go generateNumbers(3, &wg, ch1) fmt.Println("Waiting for goroutines to finish...") wg.Wait() fmt.Println("Done!") }
修复说明
- 共享通道:让两个goroutine使用main中创建的同一通道,确保数据能在goroutine间传递。
- 通道关闭:
generateNumbers完成发送后关闭通道,printNumbers通过for range循环自动识别通道关闭,避免无限阻塞。 - 修正格式化输出:添加占位符
%d,正确打印每次计算的sum值。 - 移除无效逻辑:删除
printNumbers中无关的循环打印,专注于通道数据处理。
运行结果
Waiting for goroutines to finish... Generating number 1 Sum is now: 1 Generating number 2 Sum is now: 3 Generating number 3 Sum is now: 6 Done!
内容的提问来源于stack exchange,提问作者Witty Apps
相关产品推荐
相关产品推荐

