ゴルーチンやチャンネルといった並行処理についてまとめます
ゴルーチンとは
- Goにはゴルーチンという軽量スレッドの仕組みがある。(main()関数も1つのゴルーチンの中で実行されている)
- go構文を用いて、任意の関数を別ゴルーチンとして起動することで処理を並行にして走らせることができる
チャネル
- 複数のゴルーチン間でデータをやり取りしたい場合に用いる
- メッセージパッシング(情報をメッセージとして送受信する)によってデータを送受信することができる
- make()関数に型を指定して生成することで、その型のデータの書き込みと読み出しができる。
main.go
// stringを扱うチャネルを生成
ch := make(chan string)
// チャネルにstringを書き込む
ch <- "a"
// チャネルからstringを読み出す
message := <- ch
ゴルーチン内で取得したステータスコードをチャネルに書き込み、main()のゴルーチンで読み出すことでデータの受け渡しを実現する
main.go
package main
import "fmt"
func main() {
urls := []string {
"https://example.com",
"https://example.jp",
"https://example.net",
}
statusChan := make(chan string)
for _, url := range urls {
go func(url string) {
res, err := http.Get(url)
if err != nil {
log.Fatal(err)
}
defer res.Body.Close()
statusChan <-res.Status
}(url)
}
for i := 0; i < len(urls); i++ {
fmt.Println(<-status)
}
}