golang本身支持这种表达,增加一个接受变量如果chan没有关闭是true或者chan里有缓冲数据的时候,则可以取出,只有chan是关闭切没有缓冲数据的时候才会返回false,value会返回nil 不会有阻塞。
c1:=make(chan int)
value,ok:=<-c1

func main(){
        c1:=make(chan int,5)
        c1<-1
        close(c1)
        _,ok:=<-c1
        fmt.Println(ok)
        _,ok=<-c1
        fmt.Println(ok)

}

更新:最官方合理但是比较绕的无阻塞操作channel方法, 请大家参考reflect标准库里的trySend tryRevice 方法