在尝试发送之前进行非阻塞通道发送,测试失败?

时间:2015-03-12 17:12:11

标签: go nonblocking channels

有没有办法在没有实际尝试发送的情况下测试go频道发送失败?标准的非阻塞发送是这样的:

msg := "hi"
select {
    case messages <- msg:
        fmt.Println("sent message", msg)
    default:
        fmt.Println("no message sent")
    }

问题是我需要准备发送“msg”才能测试频道。

我想测试一下发送是否会以不需要“msg”准备发送的方式失败。

1 个答案:

答案 0 :(得分:7)

在一般情况下这没有任何好处,因为你有一场比赛。生成msg后,通道可能不再准备发送。

如果您需要这种模式,您需要第二个信号通道,

select {
    case <-ready:
        msg := generateMsg()
        messages <- msg
        fmt.Println("sent message", msg)
    default:
        fmt.Println("no message sent")
}

或者您可以使用sync.Cond