Chapter 01

はじめに

さき(H.Saki)
さき(H.Saki)
2021.08.28に更新

この本について

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の基本的な文法の読み書きができること
  • 特に並行処理・ゴールーチン・チャネルについては既知として扱います。