Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
encoding/json/v2のUnmarshalはこう変わった:内部実装で見る設計改善
Search
Hiroki Kurasawa
February 21, 2026
Programming
0
100
encoding/json/v2のUnmarshalはこう変わった:内部実装で見る設計改善
Go Conference mini in Sendai 2026 のLT枠「encoding/json/v2のUnmarshalはこう変わった:内部実装で見る設計改善」で発表した登壇資料です。
Hiroki Kurasawa
February 21, 2026
Tweet
Share
More Decks by Hiroki Kurasawa
See All by Hiroki Kurasawa
Go1.26 go fixをプロダクトに適用して困ったこと
kurakura0916
0
320
Other Decks in Programming
See All in Programming
2026/02/04 AIキャラクター人格の実装論 口 調の模倣から、コンテキスト制御による 『思想』と『行動』の創発へ
sr2mg4
0
660
米国のサイバーセキュリティタイムラインと見る Goの暗号パッケージの進化
tomtwinkle
1
370
ご飯食べながらエージェントが開発できる。そう、Agentic Engineeringならね。
yokomachi
1
280
猫の手も借りたい!ので AIエージェント猫を作って社内に放した話 Claude Code × Container Lambda の Slack Bot "DevNeko"
naramomi7
0
230
CDIの誤解しがちな仕様とその対処TIPS
futokiyo
0
150
20260228_JAWS_Beginner_Kansai
takuyay0ne
5
410
AI主導でFastAPIのWebサービスを作るときに 人間が構造化すべき境界線
okajun35
0
460
AIによる開発の民主化を支える コンテキスト管理のこれまでとこれから
mulyu
3
2.2k
要求定義・仕様記述・設計・検証の手引き - 理論から学ぶ明確で統一された成果物定義
orgachem
PRO
4
710
オブザーバビリティ駆動開発って実際どうなの?
yohfee
3
650
15年目のiOSアプリを1から作り直す技術
teakun
0
580
API Platformを活用したPHPによる本格的なWeb API開発 / api-platform-book-intro
ttskch
1
110
Featured
See All Featured
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
Building Flexible Design Systems
yeseniaperezcruz
330
40k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
360
KATA
mclloyd
PRO
35
15k
The untapped power of vector embeddings
frankvandijk
2
1.6k
BBQ
matthewcrist
89
10k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.8k
Thoughts on Productivity
jonyablonski
75
5.1k
Music & Morning Musume
bryan
47
7.1k
Balancing Empowerment & Direction
lara
5
930
The Cult of Friendly URLs
andyhume
79
6.8k
Transcript
encoding/json/v2のUnmarshalはこう変わった ~内部実装で見る設計改善 ~ Go Conference mini in Sendai 2026 @kurasawah
1
⾃⼰紹介 • 倉澤 大樹(@kurasawah) ◦ 株式会社ZOZOで検索機能を開発しています ◦ GoとElasticsearchが好きです 2
このテーマを話そうと思ったきっかけ • encoding/json/v2はGo1.25で実験的に追加された • v2では「処理速度」「メモリ使用量」「アロケーション回数」 「エラー内容」が改善された • 「なぜ改善されたのか?」を内部設計から理解したくなった • 調べてみると、自分のコードにも活かせそう
3
今日話す4つの改善ポイント 1. パッケージ分離 2. エラーの原因特定 3. オブジェクトの再利用(sync.Pool) 4. 効率的なバッファ管理 4
v2のUnmarshal: 4つの改善ポイント 5 func Unmarshal(in []byte, out any, opts ...Options)
(err error) { dec := export.GetBufferedDecoder(in, opts...) defer export.PutBufferedDecoder(dec) xd := export.Decoder(dec) err = unmarshalDecode(dec, out, &xd.Struct, true) return err } コード 改善ポイント export オブジェクト パッケージ分離 err エラーの原因特定 Get/PutBufferedDecoder オブジェクトの再利用(sync.Pool) Decoder 構造体 効率的なバッファ管理 src/encoding/json/v2/arshal.go
改善点1: パッケージ分離 v1: encoding/json 1パッケージに全機能が混在 v2: jsontext(構文層)+ json(意味層)に分離 パッケージ 層
例 jsontext 構文層 { , "name" , : , "Alice" ... json 意味層 "Alice" → User.Name なぜ良いか • 責務が分かれ、変更の影響範囲が限定される • 構文層(jsontext)を単独で利用できる 6
{"name":"Alice","age":"thirty"} → User.Ageはint型なのでエラー v1: cannot unmarshal string into Go struct
field User.Age v2: cannot unmarshal JSON string into Go int within "/age" 改善点2: エラーの原因特定 なぜ原因特定が容易か • JSONPointerで「どこで」、JSONKindで「何型が」失敗したか分かる &SemanticError{ … JSONPointer: "/age" , // どこで JSONKind: '"', // JSON型(string) GoType: reflect.TypeOf(int(0)), // 期待した型 ... } src/encoding/json/v2/errors.go
• v1: 毎回ゼロ値初期化 → 呼び出しごとにメモリ確保 • v2: GetBufferedDecoder PutBufferedDecoder でプール管理
なぜ良いか : 高頻度呼び出し時のアロケーションとGCへの負担を削減 改善点3: オブジェクトの再利用 (sync.Pool) 1回目: Unmarshal({"name":"Alice",...}) ↓ Decoder取得 ↓ 処理 ↓ Poolへ戻す 2回目: Unmarshal({"name":"Bob",...}) ↓ 同じDecoder再利用 8
なぜ良いか : buf[prevStart:prevEnd] でコピーなしに前回値へアクセス可能 例: {"name":"Alice","age":30} を "Alice" まで読んだ時 →
buf[prevStart:prevEnd] = "Alice" decodeBuffer — 1つの []byte を論理的に4分割 改善点4: 効率的なバッファ管理 9 type decodeBuffer struct { … buf []byte // 入力全体を保持するバッファ prevStart int // 前回読んだ値の開始位置 prevEnd int // 前回読んだ値の終了位置 rd io.Reader // 入力元(ストリーミング対応) } src/encoding/json/jsontext/decode.go
まとめ • パッケージ分離 : jsontext + jsonによる責務の分離 • エラーの原因特定 :
SemanticErrorによる構造化エラー • オブジェクトの再利用 : sync.Poolによるアロケーション削減 • 効率的なバッファ管理 : decodeBufferによるコピーなしアクセス 10