お急ぎの方へ 先に結論のコード
チャネルのサンプル
package main
import (
"fmt"
)
func hode(result chan string) {
result<- "hogeです。"
}
func main() {
result := make(chan string)
go hode(result)
fmt.Printf(<-result) // => hogeです。
}
並行処理でのチャネルの使い方とは
あるメソッドの処理結果を、mainメソッドに返して使いたい。
ただし、goroutineを使って並列処理で…
という処理を行いたい場合、
不可な例
res1 := go hoge()
go res2 := fuga()
こういった書き方では、処理してもらえません。
(syntaxエラーが出ます。)
そこで、mainメソッドで用意した変数に、任意のメソッドでの処理結果を代入する…
といったやり方をすることによって、上記を叶えることができます。
ここでチャネルを使います。
チャネルの書き方サンプル
チャネルの書き方
package main
import (
"fmt"
)
func hode(result chan string) {
result<- "hogeです。" // 3.チャネルであるresultに、「hogeです。」が代入される
}
func main() {
result := make(chan string) // 1.変数を用意してチャネル名を設定
go hode(result) // 2.チャネルを引数に入れてメソッド実行
res := <-result // 4.resultに値が入ったことを確認して、その値を変数resに代入
fmt.Printf("resultには「%s」が入っています。\n", res)
}
解説
1.変数を用意して、チャネルの名前を設定
result := make(chan string)
このようにして、スライスなどと同じ、参照型のデータを用意します。
2.チャネルを、引数に入れてメソッド実行
go hode(result)
こんな感じです。
- goはgoroutineの書き方
- hogeはここではメソッド名
-
()
内に変数resultを入れることで、メソッドに引数として渡している。
-
3.メソッド内でチャネルに値を代入する
result<- "hogeです。"
ここですね。
result<-
変数に左矢印という、特徴的な書き方ですね。
4.mainメソッドでチャネルを使う
res := <-result
(実際の現場では、あまりこのような書き方はしないかもですが…)
ここでは、変数resにresultというチャネルの値を代入しています。
重要なのは、
<-result
これで、チャネルから値を取得できるということです。
ちなみに
さきほどもちらっと書きましたが、チャネルの値をわざわざ変数に入れることなく、そのまま使えます。
こんなに丁寧に書かなくても…
res := <-result
fmt.Printf(res)
これでもOK
fmt.Printf(<-result)
結果は同じものが出力されます。
今回の記事では、細かい説明を共有したかったので、冗長に書いてます…
さいごに
今日は、チャネルについて学んだので、共有させていただきました。
なお、関連記事として、並行処理についての記事はこちらです。
最後までありがとうございました。