1

どうすれば次のようなことができますか?:

func foo(input <-chan char, output chan<- string) {
    var c char
    var ok bool
    for {
        if ThereAreValuesBufferedIn(input) {
            c, ok = <-input
        } else {
            output <- "update message"
            c, ok = <-input
        }
        DoSomethingWith(c, ok) 
    }
}

基本的に、チャンにバッファリングされた値があるかどうかを確認して、ない場合は、スレッドがブロックされる前に更新メッセージを送信できるようにします。

4

3 に答える 3

3
package main

func foo(input <-chan char, output chan<- string) {
        for {
                select {
                case c, ok := <-input:
                        if ok { // ThereAreValuesBufferedIn(input)
                                ... process c
                        } else { // input is closed
                                ... handle closed input
                        }
                default:
                        output <- "update message"
                        c, ok := <-input // will block
                        DoSomethingWith(c, ok)
                }

        }
}

編集: スコープのバグを修正しました。

于 2013-07-30T15:40:59.903 に答える
1

他の人は、コードで何をしたいのか( a を使用select)について質問に答えましたが、完全を期すために、質問のタイトルで尋ねられた特定の質問に答えます(「値が a にバッファリングされているかどうかを確認する方法はありますか. Go chan?")、lenおよびcap組み込み関数は、バッファリングされたチャネルで期待どおりに動作します (バッファリングされたlen要素の数を返し、capチャネルの最大容量を返します)。

http://tip.golang.org/ref/spec#Length_and_capacity

于 2013-07-30T18:05:47.357 に答える