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
gob バイナリが Go バージョンによって 出力が変わることについて調べてみた / Inve...
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
convto
September 13, 2024
Technology
0
150
gob バイナリが Go バージョンによって 出力が変わることについて調べてみた / Investigating How gob Binary Output Changes Across Go Versions
Asakusa.go #3 での発表資料です
convto
September 13, 2024
Tweet
Share
More Decks by convto
See All by convto
monorepo の Go テストをはやくした〜い!~最小の依存解決への道のり~ / faster-testing-of-monorepos
convto
2
620
詳解!defer panic recover のしくみ / Understanding defer, panic, and recover
convto
0
340
MCPと認可まわりの話 / mcp_and_authorization
convto
2
1.2k
バクラクの認証基盤の成長と現在地 / bakuraku-authn-platform
convto
4
1.7k
Go 関連の個人的おもしろCVE 5選 / my favorite go cve
convto
3
530
バイナリを眺めてわかる gob encoding の仕様と性質、適切な使い方 / understanding gob encoding
convto
6
3.1k
みんなでたのしむ math/big / i love math big
convto
0
310
Go1.22からの疑似乱数生成器について/go-122-pseudo-random-generator
convto
2
950
Go1.20からサポートされるtree構造のerrの紹介と、treeを考慮した複数マッチができるライブラリを作った話/introduction of tree structure err added since go 1_20
convto
0
1.3k
Other Decks in Technology
See All in Technology
AI開発をスケールさせるデータ中心の仕組みづくり
kzykmyzw
0
160
Proxmoxで作る自宅クラウド入門
koinunopochi
0
190
Azure SRE Agent x PagerDutyによる近未来インシデント対応への期待 / The Future of Incident Response: Azure SRE Agent x PagerDuty
aeonpeople
0
180
なぜCREを8年間続けているのか / cre-camp-4-2026-01-21
missasan
0
1.3k
さくらのクラウドでのシークレット管理を考える/tamachi.sre#2
fujiwara3
1
220
AI時代にあわせたQA組織戦略
masamiyajiri
5
2.5k
Exadata Database Service ソフトウェアのアップデートとアップグレードの概要
oracle4engineer
PRO
1
1.2k
ビジュアルプログラミングIoTLT vol.22
1ftseabass
PRO
0
140
AI開発の落とし穴 〜馬には乗ってみよAIには添うてみよ〜
sansantech
PRO
9
3.9k
ファシリテーション勉強中 その場に何が求められるかを考えるようになるまで / 20260123 Naoki Takahashi
shift_evolve
PRO
3
380
SOC2は、取った瞬間よりその後が面白い
3flower
1
200
re:Inventで見つけた「運用を捨てる」技術。
ezaki
1
140
Featured
See All Featured
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.7k
Producing Creativity
orderedlist
PRO
348
40k
The Power of CSS Pseudo Elements
geoffreycrofte
80
6.1k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.3k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
120
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
95
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
0
130
Ruling the World: When Life Gets Gamed
codingconduct
0
130
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
0
130
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
1
80
The browser strikes back
jonoalderson
0
340
Docker and Python
trallard
47
3.7k
Transcript
gob バイナリが Go バージョンによって 出力が変わることについて調べてみた 2024/09/13 Asakusa.go #3
自己紹介 @convto 株式会社LayerX所属 (読みはこんぶとです)
gob ってなに? - Go が標準パッケージで実装してる独自のエンコーディング! - 仕様とかくわしく知りたい人はこちらをご覧ください https://speakerdeck.com/convto/understanding-gob-encoding - きょうは
5min LT なので全員完全理解者だと思って話を進めます
ある日知人から以下のタレコミをうける
タレコミ - なんか Go のバージョンによって gob の出力が異なるんだけど - marshal/unmarshal 間の互換性はありそう
- どこで変わったんだろうね
確認してみる
確認してみる
None
cnt: 36 id: -64 cnt: 12 id: 64 cnt: 37
id: -65 cnt: 12 id: 65
なんか typedef / value の id がずれてそう - たしかに出力は変わっている -
id の値が変わっている - id = 65 だと typedef がちょうど 1byte で表現できないため、古い方は ちょっと勿体無い - 先頭 1bit が終端判定、末尾 1bit が正負判定。値が 6bit で収まる なら 1byte で表現できる。65 はちょうどたりない
どこで入った? - 霊感で 1.21 まで比べてみたら 1.23 と一致してた $ diff -s
<(go1.21.0 run main.go) <(go1.23.0 run main.go) Files /dev/fd/11 and /dev/fd/12 are identical - 1.20.1 系では挙動に差がない $ diff -s <(go1.20.1 run main.go) <(go1.20.14 run main.go) Files /dev/fd/11 and /dev/fd/12 are identical - 1.21 に上がる時に入っているはず!
見つけた! https://go-review.googlesource.com/c/go/+/460543/4 /src/encoding/gob/type.go#b184
id ずれた理由 - firstUserId = 64 が定義されてて user 定義の型は id
= 64 から始ま る - とりあえず nextId +1 から確保してたのが止まって 64 から使えるように なったという話っぽい!
スッキリ
知人に伝えて平和が訪れた
感想 - marshal/unmarshal の互換を担保した上で encoded な値が変わるこ とはちょいちょいある - よくあるのはフィールド順番担保されないとか。今回は typeid
が揃わな かった - encoded な値に対して一致するか確認する、みたいな処理は秘孔をつく 可能性があるのでやめておきましょう
ご清聴ありがとうございました