LoginSignup
3
0

More than 5 years have passed since last update.

プログラミング言語Go読書会#15(8.1-8.4.3)[2017/07/05]

Last updated at Posted at 2017-07-11

Go読書会 #15ランサーズ株式会社で行われたので進捗と技術的なメモ書きを書いておきます。読書会の内容はプログラミング言語Goを冒頭から皆で読み進めていくというものです。

進捗した内容

  • 8章 ゴルーチンとチャンネル
    • 8.1 ゴルーチン
    • 8.2 例:平行な時計サーバ
    • 8.3 例:平行なエコーサーバ
    • 8.4 チャネル
    • 8.4.1 バッファ無しチャネル
    • 8.4.2 パイプライン
    • 8.4.3 一方向チャネル型

話題に上がった話

8.1 ゴルーチン

ここでは、プログラムを開始するmain関数もゴルーチンでメインゴルーチン(main goroutine)と呼ばれるところが話題になりました。ここまではあまり意識せずに来ていたのですが、mainそのものもゴルーチンであるという共通認識ができたところが良かったです。

呼び出し方そのものは以下のように関数呼び出しの前にgoをつけるだけなのですが、これまでのように処理の終了を待たないというところが違います。

go f()

あとは、mainから戻ることプログラムを終了させること以外にゴルーチンを他のゴルーチンから終了させる方法が無いことも話題になりました。

8.4 チャネル

ここでは、ゴルーチンが他のゴルーチンへ値を送れるようになる仕組みであるチャネル(channel)の解説がされています。チャネルは要素型(element type)と呼ばれる特定の型の為の導管で、以下のように宣言します。

ch := make(chan int)

送信と受信ができ、以下の構文で行うことができます。

ch <- x // 送信
x = <- ch // 受信

あとは、closeについて解説されており、closeされた後に送信使用とするとpanicが起こることが書かれていました。

8.4.1 バッファ無しチャネル

チャネルには、バッファ有りとバッファ無しがあり、makeで生成するときにバッファを指定しないか、0をしていすればバッファ無しチャネルになります。

ch := make(chan int)
// or
ch := make(chan int, 0)

8.4.2 パイプライン

ここでは、バッファ無しチャネルはゴルーチンを同期(synchronize)させるので同期チャネルと呼ばれていること。x happens beforeに関して説明していて、呼び出す前の処理に依存できることが書いてありました。安心ですね。あとは、順序を仮定できないx is concurrent with yについても説明されていました。

8.4.3 一方向チャネル型

指定無しで宣言した場合、goのチャネルは送信、受信に使用することができます。これだと意図されない使われ方が起きるの可能性があるので、宣言で、送信専用か受信専用に指定することができます。

out chan<- int // send-only
in  <-chan int // recive-only

これでより安全にプログラムを組むことができます。

ここまで呼んだところで、時間になりました。次回は 8.4.4 バッファありチャネルからです。

3
0
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
3
0