LoginSignup
0
2

More than 3 years have passed since last update.

[Golang]並列処理で便利な、チャネル(channel)のサンプルコード

Last updated at Posted at 2019-08-15

お急ぎの方へ 先に結論のコード

チャネルのサンプル
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)

結果は同じものが出力されます。
今回の記事では、細かい説明を共有したかったので、冗長に書いてます…

さいごに

今日は、チャネルについて学んだので、共有させていただきました。
なお、関連記事として、並行処理についての記事はこちらです。

最後までありがとうございました。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2