Go勉強会 Webアプリケーション編 #4(context)を開催しました

昨日2019/1/24、株式会社IDOMさんを会場に、Go勉強会 Webアプリケーション編 #4(context)を開催しました。

ファシリテータは私で、私がまとめた[Go]contextパッケージの解説の記事を元にGo のContextパッケージについて、みんなで勉強していきました。

議論の中心になったのは並行処理。
並行処理はどの言語でもハンドリングが難しいですね。
Goではゴルーチンを使って完結に完結に表現できますが、それでも「スレッドによってどのコードが呼ばれるのか?」を実感するのが難しい印象でした。

内容

contextパッケージの定義を直接みて理解を深めました。

select文について

私の理解が追いついてなくてGo言語のselect文の説明がうまくできなかったです。

複数のチャネルに対して受信/送信が発生したことを検知して特定のコードを実行できるものと理解しています。
こちらの記事が参考になるかも。

Go by Example: Select

チャネルをブロッキングせずに操作ができるそう。

func WithValueメソッドついて

func WithValueメソッドのkeyは==と!=演算子を使った時に適切な値を返す必要がありますが、引数の型はinterface{}でなんでも受け入れています。
なぜかを定義見るときちんとComparable()かどうかを判断していました。

func WithValue(parent Context, key, val interface{}) Context {
	if key == nil {
		panic("nil key")
	}
	if !reflect.TypeOf(key).Comparable() { // 比較できるかを判断
		panic("key is not comparable")  // 比較できないならpanicにする
	}
	return &valueCtx{parent, key, val}
}

定義を読むの大事ですね。
ではなぜ引数をinterface{}にしているかはまだ理解できていないです。
struct型でも受け入れるためですかね?

会について

次回の開催と内容はまだ未定です。決まったらまたconnpassで連絡します!

資料