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

Go goroutine与channel使用出现死锁及channel长度为0问题咨询

问题原因及解决方案

1. 为什么创建的channel长度为0

  • Go中channel分为有缓冲和无缓冲两种,你使用make(chan int)未指定第二个容量参数,创建的是无缓冲channel,本身容量就是0
  • 无缓冲channel不会缓存任何数据,只有发送方和接收方同时就绪时才能完成数据传递,数据不会在channel中停留。len(channel)返回的是channel中当前暂存的元素个数,所以你打印len(mychannel)时,子goroutine还未开始发送数据,返回的长度自然为0,哪怕后续收发过程中,无缓冲channel的len绝大多数时候也都是0

2. 死锁原因

  • 你使用for range遍历channel时,该遍历会持续阻塞直到channel被显式关闭,才会退出循环
  • 你的takeChn函数发送完10个整数后,直接结束运行,没有关闭channel,主goroutine会永远卡在遍历channel的逻辑上,此时没有其他活跃的goroutine在运行,Go runtime就会抛出死锁错误

修复方案

只需要在takeChn函数发送完所有数据后,关闭channel即可,修复后的代码如下:

package main

import (
    "fmt"
)

func main() {
    mychannel := make(chan int)
    go takeChn(mychannel)

    fmt.Println("length", len(mychannel))

    for res := range mychannel {
        fmt.Println("firstFunc", res, len(mychannel))
    }
}

func takeChn(c chan int) {
    for i := 0; i < 10; i++ {
        c <- (i + 1)
    }
    // 新增:发送完数据后关闭channel
    close(c)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 07:15:00