Go 如何获取无缓冲通道中的元素数

Go 如何获取无缓冲通道中的元素数,go,deadlock,channel,goroutine,Go,Deadlock,Channel,Goroutine,我的程序处于死锁状态,我想调试它,并告诉有多少元素在一个无缓冲通道中,有什么方法可以在Go中实现这一点吗?下面的代码没有像我预期的那样输出2(进一步,它会死锁,这也是我找不到原因的) 主程序包 输入“fmt” func main(){ 频道:=制作(成串) 完成频道:=制作(chan bool) go func(){ 通道Go运行时有一个死锁检测器,您刚刚遇到。该检测器为您提供了解决问题所需的所有信息。您不需要分析通道长度 让我们看看程序的输出 value fatal error: all go

我的程序处于死锁状态,我想调试它,并告诉有多少元素在一个无缓冲通道中,有什么方法可以在Go中实现这一点吗?下面的代码没有像我预期的那样输出2(进一步,它会死锁,这也是我找不到原因的)

主程序包
输入“fmt”
func main(){
频道:=制作(成串)
完成频道:=制作(chan bool)
go func(){

通道Go运行时有一个死锁检测器,您刚刚遇到。该检测器为您提供了解决问题所需的所有信息。您不需要分析通道长度

让我们看看程序的输出

value
fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan receive]:
main.main()
    /home/grzesiek/test.go:16 +0x17e

goroutine 5 [chan send]:
main.main.func1(0xc42001a0c0, 0xc42001a120)
    /home/grzesiek/test.go:10 +0x99
created by main.main
    /home/grzesiek/test.go:13 +0x9c
exit status 2
这意味着所有的goroutine都处于休眠状态(阻塞),不可能有任何进展。阻塞的goroutine与阻塞操作和导致阻塞的线路一起列出

Goroutine 1(主)正在尝试从第16行的通道
done\u通道
读取数据

Goroutine 5(由函数调用操作符
()
)在第13行创建)正在尝试写入第10行的通道
通道
。由于香奈儿的另一侧没有Goroutine,因此它永远不会写入通道
完成

程序被阻止,因为没有goroutine可以继续,主goroutine也被阻止


请注意,Go程序在主goroutine结束时结束,因此,如果您不尝试从
done\u通道

读取,则不会出现死锁。无缓冲通道不包含任何元素,它是无缓冲的。@JimB我正处于无限阻塞通道的情况下,我想调试它以查看是否存在错误通道中的任何东西,因为通过单步执行代码,确实显示元素已发送到通道,您建议我如何执行此操作?无缓冲通道是同步的,您只能在有接收器时发送。通道不存储(缓冲区)任何东西。你之所以阻塞,是因为你试图发送2个值,但只接收1个。@JoelCornett:这是个坏主意。你不仅在通道片上添加了竞争条件,阻止了同时在多个通道上进行选择,并且失去了通过关闭通道停止范围的能力,而且你的接收循环是默认的进入一个使用100%CPU的繁忙循环,最终将阻塞调度程序。@JoelCornett:你的假设是错误的,唯一的原子操作是通过同步/原子包进行的。这里不是进行此对话的地方--请仔细阅读go memory model文档和我链接的文章。
value
fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan receive]:
main.main()
    /home/grzesiek/test.go:16 +0x17e

goroutine 5 [chan send]:
main.main.func1(0xc42001a0c0, 0xc42001a120)
    /home/grzesiek/test.go:10 +0x99
created by main.main
    /home/grzesiek/test.go:13 +0x9c
exit status 2