Go勉強会 Webアプリケーション編 #4(context)を開催しました
昨日2019/1/24、株式会社IDOMさんを会場に、Go勉強会 Webアプリケーション編 #4(context)を開催しました。
ファシリテータは私で、私がまとめた[Go]contextパッケージの解説の記事を元にGo のContextパッケージについて、みんなで勉強していきました。
議論の中心になったのは並行処理。
並行処理はどの言語でもハンドリングが難しいですね。
Goではゴルーチンを使って完結に完結に表現できますが、それでも「スレッドによってどのコードが呼ばれるのか?」を実感するのが難しい印象でした。
内容
contextパッケージの定義を直接みて理解を深めました。
select文について
私の理解が追いついてなくてGo言語の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で連絡します!
資料
- [Go]contextパッケージの解説
- これをもとに議論をしました。
- https://github.com/SatoTakeshiX/sample-go-context
- 「Go言語による並行処理」のサンプルコードを写経したものです。ローカルで実行ができます。
- 「Go言語による並行処理」
- オライリー・ジャパンから出版されているGoの並行処理を理解するには一番の書籍です。