この本について
Goのcontext
パッケージって、使い所がとてもわかりにくいですよね。
例えばnet/http
なら、httpサーバーや、http通信をする際に必要になるツールをまとめているんだな、とわかります。
またdatabase/sql
なら、DB接続→クエリを投げてデータを取得するためのツールが入っているんだな、と一目瞭然です。
ですがcontext
と聞いても、「これは一体なんだ?」となる方がきっと大半なのではないでしょうか。
私が初めてcontextと出会ったのは、OpenAPI Generatorというもので、APIを叩くクライアントコードを自動生成させたときでした。
なぜかcontextという謎の第一引数を渡さないといけない仕様になっていて、「何だこれ知らねえ」と思ったのを覚えています。
この本では、
- かつての私と同様「context?何それ美味しいの?」「何でこんな謎なもの使わなきゃいけないの?」という方がcontextの使い所を理解できるように
- contextを何となくで使っている方が「より誤解なく・よりよく使うためにはどうすればいいのか」というところについてもわかっていただけるように
Goのcontextについての説明をまるっとまとめていきたいと思います。
本の構成
2章: contextの概要
そもそもcontextは何者なのかという定義部分を、これがあって何が嬉しいの?という動機とあわせて紹介します。
3章: Doneメソッド
contextについてくるDone
メソッドと、context.WithCancel()
関数の用途について説明します。
4章: キャンセルの伝播
contextを複数作った場合において、一つをキャンセルしたらそのキャンセル信号がどう伝播していくのか、というところについて詳しく説明します。
5章: Deadlineメソッドとタイムアウト
contextについてくるDeadline
メソッドと、context.WithDeadline
関数・context.WithTimeout
関数の用途について説明します。
6章: Errメソッド
contextについてくるErr
メソッドの用途について説明します。
7章: Valueメソッド
contextについてくるValue
メソッドと、context.WithValue()
関数の用途について説明します。
8章: Valueメソッドを有効に使うtips
contextに与えられるkeyとvalueについて、
- keyに設定できる値・設定できない値は何か
- keyの衝突を回避する方法
- contextの性質上、valueに入れるべきではない値・入れてもいい値は何か
ということについて論じます。
9章: contextの具体的な使用例
ここでは、今まで紹介したcontextの機能の中でも、
- タイムアウトを使ったキャンセル処理
-
Value
メソッドを使った値の伝播
を複合的に使った、ミニhttpサーバーもどきのコードをお見せします。
10章: パッケージへのcontext導入について
この章では、
-「contextを構造体のフィールド内に埋め込むのは良くない」という話
-
context.TODO
関数の使い所
を、既存パッケージへのcontext対応を例に出しながら説明します。
11章: contextの内部実体
ここでは、
-
context.Context
型が「インターフェース」であるということ - このインターフェースを満たす具体型は何だ?
ということについて軽く触れておきます。
使用する環境・バージョン
- OS: macOS Catalina 10.15.7
- go version go1.17 darwin/amd64
読者に要求する前提知識
- Goの基本的な文法の読み書きができること
- 特に並行処理・ゴールーチン・チャネルについては既知として扱います。