VOOZH
about
URL: https://speakerdeck.com/chiroruxx/contexttohananika
⇱ Contextとはなにか - Speaker Deck
Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
👁 Speaker Deck
Speaker Deck
👁 Speaker Deck
Contextとはなにか
Sponsored
·
👁 Image
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
👁 Avatar for chiroruxx
chiroruxx
June 17, 2026
Programming
350
1
Share
Embed
Contextとはなにか
2026/06/17 GoConnect #14 で登壇した資料です。
なお、登壇中にサンプルコードⅡforループが抜けていることが発覚しています。
👁 Avatar for chiroruxx
chiroruxx
June 17, 2026
More Decks by chiroruxx
See All by chiroruxx
初心者エンジニアから中級者エンジニアになるためにオススメの1冊
👁 Avatar for chiroruxx
chiroruxx
0
130
Laravelのパッケージ全部紹介する
👁 Avatar for chiroruxx
chiroruxx
2
130
Gopher のための「自由な話し合い」ワークショップ
👁 Avatar for chiroruxx
chiroruxx
0
47
PHPをGoで動かす
👁 Avatar for chiroruxx
chiroruxx
0
99
Goを使ってTDDを体験しよう!
👁 Avatar for chiroruxx
chiroruxx
1
1.1k
今ならできる!PhpStormプラグイン開発
👁 Avatar for chiroruxx
chiroruxx
0
100
Go Connectへの想い
👁 Avatar for chiroruxx
chiroruxx
0
220
eBPF with PHPをさわる
👁 Avatar for chiroruxx
chiroruxx
0
190
sl完全に理解したつもり
👁 Avatar for chiroruxx
chiroruxx
0
170
Other Decks in Programming
See All in Programming
Developing with AI Agents — Codex, Claude Code & Cowork Practical Guide
👁 Avatar for Daisuke Masuda
x5gtrn
PRO
0
1.3k
不変条件と整合性境界—ビジネスが決める設計判断と実現パターン / Invariants and Consistency Boundaries
👁 Avatar for nrs
nrslib
14
5.7k
その問い、本当に正しいですか?AI時代のエンジニアに必要な哲学と認知科学 / ai-philosophy-cognitive-science
👁 Avatar for MinoDriven
minodriven
11
5.9k
Dataformのリポジトリを立ち上げるときにまずやること / dataform-day0-2026
👁 Avatar for snhryt
snhryt
0
170
エンジニア向け会社紹介/Findy Company Profile
👁 Avatar for Findy
findyinc
6
350k
Lemonade + Foundry Toolkit でお手軽アプリ開発
👁 Avatar for 瀬尾佳隆
seosoft
1
360
そのテスト、説明できますか?~LWテスト戦略FW~のご紹介
👁 Avatar for Kei Nakahara
nakahara
0
150
技術記事、 専門家としてのプログラマ、 言語化
👁 Avatar for Koutarou Chikuba
mizchi
13
6.3k
AIで効率化できた業務・日常
👁 Avatar for Ochtum
ochtum
0
140
コンテキストの使い捨てをやめる — ビジネスルール駆動開発と miko —
👁 Avatar for ioki
ioki
0
210
セキュリティの専門家じゃなくてもできる。「セキュリティ意識」をアップデートして サプライチェーン攻撃への耐性を高めよう。
👁 Avatar for tk3fftk
tk3fftk
5
890
[2026年度第1回ORセミナー] 計画最適化ベンチャーと競技プログラミング人材
👁 Avatar for terry-u16
terryu16
0
270
Featured
See All Featured
B2B Lead Gen: Tactics, Traps & Triumph
👁 Avatar for Sophie Logan
marketingsoph
0
160
No one is an island. Learnings from fostering a developers community.
👁 Avatar for Antonio
thoeni
21
3.8k
Agile Actions for Facilitating Distributed Teams - ADO2019
👁 Avatar for Mark Kilby
mkilby
0
210
Test your architecture with Archunit
👁 Avatar for Yoan
thirion
1
2.3k
jQuery: Nuts, Bolts and Bling
👁 Avatar for Doug Neiner
dougneiner
66
8.5k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
👁 Avatar for Mike Taylor
tmiket
0
180
Optimizing for Happiness
👁 Avatar for Tom Preston-Werner
mojombo
378
71k
HDC tutorial
👁 Avatar for Michiel Stock
michielstock
2
720
[RailsConf 2023 Opening Keynote] The Magic of Rails
👁 Avatar for Eileen M. Uchitelle
eileencodes
31
10k
What the history of the web can teach us about the future of AI
👁 Avatar for Ines Montani
inesmontani
PRO
1
620
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
👁 Avatar for Greg Gifford
greggifford
PRO
0
200
AI: The stuff that nobody shows you
👁 Avatar for John Nunemaker
jnunemaker
PRO
8
720
Transcript
Contextとはなにか 2026/06/17 GoConnect #14
⾃⼰紹介 ちひろ X: @chiroruxxxx 株式会社モリサワ
俺はContextがわからん Goの話ね
みんな知ってる Context // GetUser はユーザを返す func (s *UserService) GetUser( ctx
context.Context, id uint, ) (*User, error) { return s.repository.FindByID(ctx, id) } 引数で受け取って 引数にわたす Contextって一体なんなんだ!?
公式によると “A Context carries a deadline, a cancellation signal,
and other values across API boundaries. ” コンテキストは、期限、キャンセルシグナル、およびその他の値 をAPI境界を越えて伝達します。 なるほどわからん
先に結論 自分なりに解釈すると 「ゴルーチンを使う場面において 親ゴルーチンの情報を子ゴルーチンに伝えるための デザインパターンの実装」 props に似てるね!
それはチャネルでは? まず、基本的な話から
ゴルーチン間の データのやりとり 呼び出し時にデータを引数で渡す パッケージ変数を使う チャネルを経由して渡す
呼び出し時に データを引数で 渡す conn, err := listener.Accept() for { if
err != nil { log.Print(err) continue } go handleConn(conn) }
パッケージ変数 を使う package bank import "sync" var ( mu sync.Mutex
balance int ) // Balance は残高を取得する func Balance() int { mu.Lock() defer mu.Unlock() return balance } // Deposit は預金する func Deposit(amount int) { mu.Lock() defer mu.Unlock() balance += amount }
チャネル 入れた順に取り出せる データが無い場合は入るまで待つ select で複数のチャネルから取り出せる 閉じるとゼロ値を取り出す
何回取ってもゼロ値が返る
キャンセル あるゴルーチンが他ゴルーチンを止める方法は無い main関数はプロセス自体が終了するので別 他のゴルーチンを止めるには、チャネルで状態を管理して キャンセル状態を知らせる キャンセルするときにチャネルを閉じる(ブロードキャスト)
そのチャネルからゼロ値を取得できたらキャンセル
チャネルを経由 して渡す // pooling は1秒ごとにファイルに変更がないかチェックする func pooling(done chan struct{}) error
{ cache, err := getFile() if err != nil { return err } tick := time.Tick(1 * time.Second) select { case <-done: fmt.Println("cancelled") return nil case <-tick: f, err := getFile() if err != nil { return err } if !f.equals(cache) { fmt.Println("file is changed!") break } } return nil }
チャネルを経由 して渡す done = make(chan struct{}) go func() { err
:= pooling(done) if err != nil { log.Print(err) } }() // ...do something close(done)
Contextと チャネル キャンセルも含めた様々な状態を一括で伝搬できるようにした のがContext Contextによって何かができるようになるのではなく キレイに実装するためのただのデザインパターン Contextの実体はチャネルだと言っても過言ではない
Contextの 実装
Contextの 使い⽅ // pooling は1秒ごとにファイルに変更がないかチェックする func pooling(ctx context.Context) error {
cache, err := getFile() if err != nil { return err } tick := time.Tick(1 * time.Second) select { case <-ctx.Done(): fmt.Println("cancelled") return nil case <-tick: f, err := getFile() if err != nil { return err } if !f.equals(cache) { fmt.Println("file is changed!") break } } return nil }
Contextの 使い⽅ ctx := context.Background() ctx, cancel := context.WithCancel(ctx) go
func() { err := pooling(ctx) if err != nil { log.Print(err) } }() // ...do something cancel()
歴史的経緯 Context は Sameer Ajmani氏による “Go Concurrency Patterns: Context”が元
Go サーバにおいて ハンドラはリクエスト固有の値にアクセスする必要があるが いつリクエストを完了、タイムアウト、キャンセルさせるべきか? このデザインパターンが golang.org/x/net/context に入る Go サーバの話だったので net パッケージ 標準化された context パッケージになった
再掲: みんな知ってる Context // GetUser はユーザを返す func (s *UserService) GetUser(
ctx context.Context, id uint, ) (*User, error) { return s.repository.FindByID(ctx, id) } 引数で受け取って 引数にわたす
ユーザーランド app router library auth0 db sendgrid みんなが書いてる コード ゴルーチン
処理 ゴルーチン 処理
まとめ 公式: コンテキストは、期限、キャンセルシグナル、およびその他 の値をAPI境界を越えて伝達します。 自分の解釈: Contextは「ゴルーチンを使う場面において 親ゴルーチンの情報を子ゴルーチンに伝えるための デザインパターンの実装」
自分の言葉に置き換えて説明ができると、理解しやすい
参考⽂献 いくつかのコードは 丸善出版『プログラミング言語Go』 アラ ン・ドノバン、ブライアン・カーニハン著 から引用しました。