見出し画像

golang contextの使い方と注意点

今回はgolangのcontextについて解説していきます。

context

Go言語のcontextパッケージはリクエストスコープの値、キャンセルシグナル、デッドラインを管理するために設計されており、主にAPIやサーバー間のやり取りでタイムアウトやキャンセル操作を扱う際に重要な役割を果たします。


contextの使い方

contextの作成

contextはcontext.Background()やcontext.TODO()から作成します。
これらのコンテキストは、明確なキャンセルポリシーがない場合や、どのようなコンテキストを使うか未定の場合に使用します。

ctx := context.Background()

コンテキストの使い道が明確な場合はcontext.WithCancel、context.WithDeadline、context.WithTimeout関数を使用して、キャンセルやタイムアウトの制御が可能なコンテキストを生成します。

ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()


contextを使って関数を呼び出す

コンテキストをパラメータとして受け取る関数を呼び出す際はコンテキストを最初のパラメータとして渡します。
このコンテキストを通じて、関数の実行をキャンセルしたり、タイムアウトを管理したりします。

func operation(ctx context.Context) error {
    select {
    case <-time.After(5 * time.Second)
        return nil
    case <-ctx.Done():
        return ctx.Err()
    }
}


golangの案件を探すならクラウドワークス テック

・97%がリモートのお仕事
・週4日、週3日OKのお仕事多数
・登録社数74万件業界トップクラス
・2〜4週間程度でお仕事決定
・案件提案から契約締結、勤怠管理もすべてオンライン完結
・継続率90%!一人ひとりをサポート
・参画後の評価で委託料が上がる認定パートナー制度
・簡単60秒で登録


contextの注意点

contextの伝播

contextはリクエストの処理チェーンを通じて伝播されるべきです。関数がcontextを受け取る場合、それを子の関数へと引き続き渡すべきです。


リソースの解放

context.WithCancel、context.WithDeadline、context.WithTimeoutを使う場合はcancel関数を呼び出してリソースを適切に解放することが非常に重要です。
通常、deferを使って関数が終了するときにcancelが呼ばれるようにします。


contextの過剰な使用を避ける

contextは必要なときにのみ使用すべきで、すべての関数でcontextを使うべきではありません。
特にライブラリ関数や低レベルのユーティリティ関数では、contextをパラメータとして要求しない方が良い場合があります。


グローバル変数としてのcontextの使用を避ける

contextはリクエストやAPIコールごとに異なる値を持つべきで、グローバル変数として設定されるべきではありません。


キャンセルの伝播

contextのキャンセルはすべての子ゴルーチンに伝播されます。
したがって、一部の操作だけをキャンセルしたい場合は、適切な子コンテキストを作成して管理する必要があります。


golangをもっと詳しくなりたい方に

初めてのGo言語

Go言語の入門から応用まではこの一冊で網羅されています。説明も順序立てて説明されており完成度の高い参考書となっています。


詳解Go言語Webアプリケーション開発

こちらはGo言語の基礎知識を得たあとに読むことをすすめる本となっています。ハンズオン形式で手を動かしながら実装をしていくことができるため、実際の開発を意識しながらGo言語を学ぶことができます。

以下の記事では他にも筆者が実際に読んでおすすめしたい本をまとめています。


【Go入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)

まだGo言語の勉強を始めていない方、全くの初心者の方にはこちらのUdemy教材が最もおすすめです。
この教材ではgolangの基礎について網羅的に学ぶことができます。ただ見て学ぶだけでなく、講座の中でアプリ作成まで行うことで学んだことの理解をさらに深めることができます。


現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発

個人的に最も勉強になったのは「現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発」という教材です。
本格的なレクチャーに入る前に、なぜGoなのか、なぜFintechなのかについて説明されていることで、Goの概念や意味について大枠から理解することができます。

以下の記事では筆者が実際に受講したおすすめUdemy教材をまとめています。

※本ページではアフィリエイトリンク(PR)が含まれています


この記事が参加している募集

この記事が気に入ったらサポートをしてみませんか?