看打印日志是 --2 打印了,--3没有打印,然后后续发送消息全部阻塞了
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
有超时吗?
没有超时
有更完整的代码吗?可以打出来看一看
#3楼 @sunanxiang 
原因是你SendMsgToClient 那个函数里面,出错的根本原因是你Msg_to_client 通道 和DelconnMsg 通道所在的goroutine 退出了,导致你for 循环里面接受的channel 没有其他goroutine 向里面传输数据,所以导致deadlock 。go 里面,for select 所监听的通道,如果没有其他携程向通道写入数据,那么这个for 就会deadlock。
package main import ( "fmt" //"time" ) func main() { var ( chaA = make(chan int) chaB = make(chan int) //timer = time.NewTicker(time.Second) ) go func() { chaA <- 1 chaB <- 2 }() for { select { case <-chaA: fmt.Println("1111") break case <-chaB: fmt.Println("2222") break //case <-timer.C: // fmt.Println("nihao") // break } fmt.Println("break here") } fmt.Println("break there") }
你用一下上面的代码,分别使用注释和没有注释的部分,就很清楚了。
`单行代码`
有超时吗?
没有超时
有更完整的代码吗?可以打出来看一看
原因是你SendMsgToClient 那个函数里面,出错的根本原因是你Msg_to_client 通道 和DelconnMsg 通道所在的goroutine 退出了,导致你for 循环里面接受的channel 没有其他goroutine 向里面传输数据,所以导致deadlock 。go 里面,for select 所监听的通道,如果没有其他携程向通道写入数据,那么这个for 就会deadlock。
你用一下上面的代码,分别使用注释和没有注释的部分,就很清楚了。