ゴルーチン間の通信
【開発環境】
OS:Win11(64ビット)
go version go1.19.4 windows/amd64
VSCode1.72.2、及びコマンドプロンプト
【チャンネルとは】
チャンネルは同時に実行されているゴルーチン間や、メインルーチンとゴルーチンとの間で、特定の形の値を受け渡す通信機構を提供する
例えば、bool値を受け渡したいとする時、
1、チャンネルを作る
ch := make(chan bool)
これで、同期しているチャンネルが作られた。
チャンネルに情報を送る為には「<-」を用います。
2、bool型のチャンネルにtrueを送ってみる。
ch <- true
3、チャンネルから情報を受取るも、「<-」を使う
x <- ch
4、受け取った事実だけを知りたい時
<- ch
5、チャンネルから正しく受け取った受け取ったどうかの判定
x,ok := <-ch
いずれにしても、これらのコードはチャンネルから、情報を受け取るまで待ちます。
・サンプルコード
// chan.go
package main
import (
"fmt"
"time"
)
func main() {
//チャンネルを作る
done := make(chan bool)
//ゴルーチンで"+"を出力する
go func() {
for i := 0; i < 10; i++ {
time.Sleep(10 * time.Millisecond)
fmt.Printf("+")
}
done <- true //終わったらtrueを送る
}()
//メインルーチンで"/"を出力する
for i := 0; i < 10; i++ {
time.Sleep(10 * time.Millisecond)
fmt.Printf("/")
}
//trueが送られるのを待って受け取る
<- done
fmt.Printf("\n終了\n")
}
・実行
PS D:\GO言語\サンプルプログラム\Go-8> go run chan.go
+//+/++//++//++//++/
終了