1

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

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

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

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

4

1 回答 1

7

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

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

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

或者你可以使用sync.Cond

于 2015-03-12T17:18:40.080 回答