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

Go语言Goroutine交替打印奇偶数字程序出现死锁问题

Go语言交替打印奇偶数字程序的死锁问题及解决

我正在学习Go语言,为了理解channel(通道)的工作机制,编写了一个由两个Goroutine交替打印奇偶数字的程序。该程序打印结果正确,但运行结束时会出现死锁错误,且无法从错误信息中明确问题原因。

原代码

func main() {
    even := make(chan bool)
    odd := make(chan bool)
    go func() {
        defer close(odd)
        for i := 0; i <= 10; i += 2 {
            <-even
            print("Even ====>")
            println(i)
            odd <- true
        }
    }()
    var wait sync.WaitGroup
    wait.Add(1)
    go func() {
        for i := 1; i <= 10; i += 2 {
            _, ok := <-odd
            if !ok {
                wait.Done()
                return
            }
            print("Odd ====>")
            println(i)
            even <- true
        }
    }()
    even <- true
    wait.Wait()
}

问题解决代码

感谢各位的回复,我编写了以下代码解决该问题:

func main() {
    even := make(chan bool)
    odd := make(chan bool)
    done := make(chan bool)
    //var wait sync.WaitGroup
    //wait.Add(2)
    go func() {
        for i := 0; i <= 10; i += 2 {
            <-even
            print("Even ====>")
            println(i)
            odd <- true
        }
        close(odd)
        close(even)
        done <- true
        // wait.Done()
    }()
    go func() {
        for i := 1; ; i += 2 {
            _, ok := <-odd
            if !ok {
                //wait.Done()
                return
            }
            print("Odd ====>")
            println(i)
            select {
            case even <- true:
            case <-done:
                return
            }
        }
    }()
    even <- true
    //wait.Wait()
    <-done
}

内容的提问来源于stack exchange,提问作者Technical Shil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 12:37:21