You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言使用通道在goroutine间传数据出现死锁问题求助

问题分析与修复

核心问题

  1. 通道隔离导致死锁:generateNumbers内部新建了未共享的通道,发送数据时无接收方,goroutine永久阻塞,触发死锁。
  2. 未处理通道数据:printNumbers未读取通道内容,也未响应通道关闭信号,无法完成数据接收逻辑。
  3. 格式化字符串错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 00:38:34