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 を生成した後、チャネルは送信する準備ができていない可能性があります。

このパターンが必要な場合は、シグナリング用の 2 番目のチャネルが必要です。

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 に答える