go channel tips

一、只有一个goroutine时,读写阻塞的chan会出错(“fatal error: all goroutines are asleep - deadlock!”)。包括未make的chan(chan = nil)

二、已经close的chan,写操作会panic(“panic: send on closed channel”),仍然可读取,实时返回数据而不会阻塞,chan中无数据会取到默认值

三、select中如果加超时case(case <- time.After(2 * time.Second):)的话,其他case的chan若一直不为空,则超时case永远不会执行。

  解决方法:在单独的select中,只加超时case

for {
        select {
            case <- ch:
        }
        select {
            case <- time.After(1 * time.Second):
        }
    }
原文地址:https://www.cnblogs.com/YYRise/p/8687212.html