Go 如何解决戈朗关禅问题

Go 如何解决戈朗关禅问题,go,deadlock,Go,Deadlock,需要编写一个删除重复项的函数 但是我犯了个错误,有什么问题吗 func remDup(in, out chan string) { for { val, ok := <-in if ok == false { break } else { if val != <-out{ out <- val } } } close(out) } :fatal er

需要编写一个删除重复项的函数 但是我犯了个错误,有什么问题吗

func remDup(in, out chan string) {
 for {
     val, ok := <-in
     if ok == false {
         break
     } else {
         if val != <-out{
             out <- val
         }
     }
 }
 close(out)
}


:fatal error: all goroutines are asleep - deadlock!

我认为这是因为您使用的是非缓冲通道,而通道是空的,或者发送方没有准备好,如下所示:

out := make(chan string)
此行为在以下内容中得到了很好的解释:

如果容量为零或不存在,则信道无缓冲,只有当发送方和接收方都准备好时,通信才成功

而且来自

如果通道无缓冲,发送方将阻塞,直到接收方收到该值

如果您想让接收方等待来自通道的任何数据,但不知道发送方是否已将数据发送到通道,请使用缓冲通道


out可能是空的,所以如果val!=当描述一个问题时,a是一个好主意。仅仅展示其中一个无法单独使用的片段就让每个人都在猜测。我想你的猜测可能是对的,但是。。。这是猜测。一般来说,从一个频道接收消息没有什么意义。你能详细说明remDup应该如何工作吗?从这个问题,函数的实现和函数的参数,我不能联系起来。准确地说,对你的问题要更详细一点,参数应该是什么,等等。
out := make(chan string, 100)