職案人

求職・歴史・仏教などについて掲載するつもりだが、自分の思いつきが多いブログだよ。適当に付き合って下さい。

ゴルーチンのselect文

2023年04月23日 | GO言語
select文


【開発環境】
OS:Win11(64ビット)
go version go1.19.4 windows/amd64
VSCode1.72.2、及びコマンドプロンプト

◆select文
select文はチヤンネルの送受に応じて処理を切り替える事ができる。

例1
select {
case v1 = <-ch1:
//ch1から受け取ったv1に保存された値を使う
case v2 = <-ch2:
//ch2に値v2を送信する
default:
//通信がない時

・サンプルコード
// selchan.go
package main

import (
"fmt"
"time"
)

func main() {
//チャンネルを作る
ch1 := make(chan rune)
ch2 := make(chan int)
done := make(chan bool)

//ゴルーチン
go func () {
s := "ABCDEFG"
for _, c := range s{
time.Sleep(10 * time.Millisecond)
fmt.Printf("ch1から送電:%c\n",c)
ch1 <- c
}
done <- true //終わったらtrueを送る

}()

//ゴルーチン数値を送る
go func () {
for i := 0;i < 0;i++ {
time.Sleep(8 * time.Millisecond)
fmt.Printf("ch2から送信:%d\n",i)
ch2 <- i+1
}
done <- true //終わったらtureを送る
}()

defer fmt.Println("終了")
count := 0

//メインルーチンで受け取ったデータを出力
for {
select {
case r := <-ch1:
fmt.Printf("ch1から受信:%d\n",r)
case n := <-ch2:
fmt.Printf("ch2から受信:%d\n",n)
case <-done: // trueが2個送られたら終了
count++
if count > 1{
return
}

   }
   }
}


・実行
PS D:\GO言語\サンプルプログラム\Go-8> go run selchan.go
ch1から送電:A
ch1から受信:65
ch1から送電:B
ch1から受信:66
ch1から送電:D
ch1から受信:68
ch1から送電:E
ch1から受信:69
ch1から送電:F
ch1から受信:70
ch1から送電:G
ch1から受信:71
終了
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする