#質問の背景
受信専用のgoroutineを作って、for-select-caseを使って各種の受信の多面待ちを行いたいと思っております。
今回の場合sync.Condを使ったbroadcast→Waitを使っているのですが、これがselect-caseでは取れないようなので、2つの返り値を作って、これに対応しようと考えています。
(もし、取れる方法がありましたら、この質問はそちらに変更とさせて下さい)
#実施したい事項
func (bc *BroadCaster) Recv() (int, chan interface{}) { bc.cond.L.Lock() defer bc.cond.L.Unlock() bc.ch <- 1 bc.cond.Wait() return bc.id, bc.ch }
というような感じにして、チャネル用の返り値(bc.ch)を追加して対応しようとしました。
#検証した実験結果
まず、返り値が「1つ」である場合、以下のようなコードで目的が達成できそうなことは確認しました。
package main import ( "fmt" ) func returnChannel() <-chan string { message := make(chan string, 1) message <- "hello world again" return message } func testChannel() <-chan string { message := make(chan string, 1) message <- "good-by world" return message } func main() { /* b := returnChannel() fmt.Println(<-b) fmt.Println(<-returnChannel()) */ select { case s := <-testChannel(): fmt.Println(s) case v := <-returnChannel(): fmt.Println(v) } }
(このコードでは、問答無用で、case s: の方が選ばれますが、機能確認用であることをご理解下さい)
#ご教示頂きたい事項
(1)このように、2つ以上の返り値を持つ関数(サブルーチン)の、特定の一つだけ(この場合は、channelだけ)を取り出して、select-case で使う方法があれば、ご教示頂けますよう、何卒よろしくお願い申し上げます。
(もしsync.Condを、他のチャネルと合わせて、select-caseで使える方法を御存じでしたら、何卒そちらの方もご教示頂けますようお願い致します)
利用環境
go version go1.17 windows/amd64
Visual Studio Code バージョン: 1.62.3 (user setup)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/06 01:34
2021/12/06 07:10