開発環境
> go version
go version go1.16.3 linux/amd64
channel
チャネル( Channel )型は、チャネルオペレータの <- を用いて値の送受信ができる通り道です。
A Tour of Go
- goroutine 間で値をやりとりする仕組み
例1
Go by Example のコードを見る。
package main
import "fmt"
func main() {
messages := make(chan string)
// message channel に文字列 "ping" を送っている
go func() { messages <- "ping" }()
// 変数 msg に message channel の値( "ping" )が代入される
msg := <-messages
// "ping" が出力される
fmt.Println(msg)
}
> go run main.go
ping
goroutine 間で値が渡されることが分かった。
例2
package main
import (
"fmt"
"time"
)
func main() {
messages := make(chan string)
// 即時実行されるが、①で messages channel に値が渡されるまで fmt.Println ができない(= ロックされる)のでブロック
go func() {
time.Sleep(10000 * time.Millisecond)
fmt.Println(<-messages)
}()
// ①
messages <- "Hello World"
}
> go run main.go
Hello World
通常、片方が準備できるまで送受信はブロックされます。これにより、明確なロックや条件変数がなくても、goroutineの同期を可能にします。
A Tour of Go
明確なロック = WaitGroupなど