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 バッファありチャネルからです。