概要
go 1.7からcontextパッケージが標準パッケージになりました。
タイムアウト、キャンセルなどのハンドリングができることから、ブロッキングする処理や外部APIリクエストなどを扱う時は基本的に第一引数に置くべきです。
またAPIやプロセス間通信のリクエストスコープの値を引き継がせる際にも利用されます。
例えばgoogleはAPIを叩くコードでは全ての関数にcontextが引数に存在します。
ブログでもこのように言っています。
At Google, we require that Go programmers pass a Context parameter as the first argument to every function on the call path between incoming and outgoing requests.
ref: Go Concurrency Patterns: Context - go.dev
一方でcontext.Value
になんでも詰め込めるため、汎用的な関数のインタフェースの引数として使うのは?という考え方もあります。
type Hoge interface { DoSomething(ctx context.Context) }
こんな感じですね。引数になんでも詰め込めるので、簡単に共通のインタフェースを持たせることができます。
結論から言うとこの使い方は良くないです。今回はcontext.Contextの使う基準について考えてみます。
続きを読む