Slide 1

Slide 1 text

バイナリを眺めてわかる gob encoding の仕様と性質、適切な使い方 2024/06/08 Go Conference 2024

Slide 2

Slide 2 text

自己紹介 @convto 株式会社LayerX所属 レイヤ低めの技術などに興味がありま す (読みはこんぶとです)

Slide 3

Slide 3 text

はじめに - この発表は積極的に gob の採用を勧めているわけではありません! - ちゃんとシステム性質に合わせて判断できることが一番望ましく、そのた めに詳細な理解が必要!という主張です - この発表では、仕様を深掘りして性質を評価する過程をみんなで楽しめれ ばと思っています - もちろん評価した上で用途に合うケースがあるなら、どんな技術であれ自 信を持って採用すると良いと思います

Slide 4

Slide 4 text

はなすこと - gobの概要, モチベーション紹介 - message encoding 評価の観点整理 - バイナリを見ながらgob仕様を深掘り - gobの評価 - まとめ

Slide 5

Slide 5 text

gobの概要, モチベーション紹介

Slide 6

Slide 6 text

gob ってなに? - データのエンコーディングのひとつ! - 有名なのは json, xml, protobuf(wire), など... - Go が標準パッケージで実装してる独自のエンコーディング!

Slide 7

Slide 7 text

gob ってなに? - データのエンコーディングのひとつ! - 有名なのは json, xml, protobuf(wire), など... - Go が標準パッケージで実装してる独自のエンコーディング! なんで独自のものが 必要だったの?

Slide 8

Slide 8 text

https://go.dev/blog/gob go blog に詳しい

Slide 9

Slide 9 text

gob のモチベ - Go のプログラム上から特別な宣言なしに利用できる - バイナリエンコーディングで情報の転送効率がよいこと - 自己言及的 (self-describing) であること - Protobuf での学びを取り込むこと

Slide 10

Slide 10 text

gob で達成したかったこと - Go のプログラム上から特別な宣言なしに利用できる - バイナリエンコーディングで情報の転送効率がよいこと - 自己言及的 (self-describing) であること - Protobuf での学びを取り込むこと 少し解説

Slide 11

Slide 11 text

自己言及的 (self-describing) であるとは - メッセージ自身にどのような構造をしているかについての情報が含まれて いること - 構造を復元できるメタ情報を body に持っていると言い換えられる

Slide 12

Slide 12 text

自己言及的 簡易的な例 - 右のような構造は自己言及的 - type の解釈だけルールを決めてお けば、何が来ても値を受け取れる

Slide 13

Slide 13 text

自己言及的でなにがうれしいの? - メッセージ一つで構造が解釈可能 - 事前に準備するものも不要 - 埋め込む情報の量によっては高度 に元の状態を再現できる

Slide 14

Slide 14 text

Protobuf で学んだこととは? - Go では struct 定義でしか動作しないこと - proto2 required は後方/前方互換担保を難しくした - required 実装を追加すると server/client 間で互換が壊れる - proto2 では default を設定できたが、実装や挙動が複雑になる - type ごとのゼロ値のような概念の方が取り回しやすい

Slide 15

Slide 15 text

Protobuf で学んだこととは? - Go では struct 定義でしか動作しないこと - proto2 required は後方/前方互換担保を難しくした - required 実装を追加すると server/client 間で互換が壊れる - proto2 では default を設定できたが、実装や挙動が複雑になる - type ごとのゼロ値のような概念の方が取り回しやすい proto3 で解決されてるのでちょっと古い

Slide 16

Slide 16 text

現代的な観点でみたときの良いところ - Goのプログラム上から特別な宣言なしに利用できる - バイナリエンコーディングで情報の転送効率がよいこと - self-describing であること - struct 必須など, 利用する encoding によって構造の持ち方が制限さ れない

Slide 17

Slide 17 text

現代的な観点でみたときの良いところ - Goのプログラム上から特別な宣言なしに利用できる - バイナリエンコーディングで情報の転送効率がよいこと - self-describing であること - struct 必須など, 利用する encoding によって構造の持ち方が制限さ れない これらを全て満たすエンコーディングはない!ので作った

Slide 18

Slide 18 text

message encoding 評価の観点整理

Slide 19

Slide 19 text

メッセージエンコーディングの性質いろいろ - パフォーマンス - サイズ - 後方/前方互換性 - 自己言及的 (self-describing) であるか - エコシステム - etc …

Slide 20

Slide 20 text

今回は以下の観点で gob を評価 - パフォーマンス - サイズ - 後方/前方互換性 - 自己言及的 (self-describing) であるか - エコシステム - etc …

Slide 21

Slide 21 text

バイナリを見ながら gob仕様を深掘り

Slide 22

Slide 22 text

ざっとバイナリをみてみる

Slide 23

Slide 23 text

ざっとバイナリをみてみる

Slide 24

Slide 24 text

ざっとバイナリをみてみる

Slide 25

Slide 25 text

型情報がそのまま埋められてそう ざっとバイナリをみてみる

Slide 26

Slide 26 text

型情報がそのまま埋められてそう 終端がありそう ざっとバイナリをみてみる

Slide 27

Slide 27 text

ざっとバイナリをみてみる 型情報がそのまま埋められてそう 終端がありそう このへんにメッセージ内容がいそう 型情報は最初の一回しか送らなそう

Slide 28

Slide 28 text

雰囲気で感じ取れること - ぱっとみ型情報をゴリっと送ってそう - 同一 stream 上だと最初の一回しか型を送ってなさそう - 明らかに終端っぽいやつがいそう - フィールド名とかを構造としてベタっと送ってるので、Protobuf (wire) み たいに field num 同じなら名前変えても無問題!とはならなさそう

Slide 29

Slide 29 text

仕様をみてみる - https://pkg.go.dev/encoding/gob#hdr-Encoding_Details あたりを みてみる - ボトムアップで説明してるので、このドキュメントだけでは全体像はわから ない感じ。実装に眼を通す必要がありそう

Slide 30

Slide 30 text

いい感じの summary を発見 https://pkg.go.dev/encoding/gob#hdr-Encoding_Details

Slide 31

Slide 31 text

こんな感じそう

Slide 32

Slide 32 text

cnt: 36 こんな感じそう

Slide 33

Slide 33 text

cnt: 36 こんな感じそう

Slide 34

Slide 34 text

cnt: 36 id: -64 こんな感じそう

Slide 35

Slide 35 text

cnt: 36 id: -64 符号付き int は2の補数表現と 異なる形式で扱われています 取り扱いがすこし面倒なため ここでは飛ばします (後ほど説明します) こんな感じそう

Slide 36

Slide 36 text

思い出そう https://pkg.go.dev/encoding/gob#hdr-Encoding_Details id が負数なら型情報了解!

Slide 37

Slide 37 text

cnt: 36 id: -64 wireType こんな感じそう

Slide 38

Slide 38 text

cnt: 14 cnt: 36 id: -64 wireType こんな感じそう

Slide 39

Slide 39 text

cnt: 14 cnt: 36 id: -64 wireType こんな感じそう

Slide 40

Slide 40 text

cnt: 14 cnt: 36 id: -64 wireType cnt: 1 id: 64 こんな感じそう

Slide 41

Slide 41 text

思い出そう https://pkg.go.dev/encoding/gob#hdr-Encoding_Details id が正なら値了解!

Slide 42

Slide 42 text

cnt: 14 cnt: 36 id: -64 wireType cnt: 1 id: 64 wireType value こんな感じそう

Slide 43

Slide 43 text

cnt: 14 cnt: 36 id: -64 wireType cnt: 1 id: 64 wireType value cnt: 13 cnt: 1 id: 64 value こんな感じそう

Slide 44

Slide 44 text

こんな感じそう cnt: 14 cnt: 36 id: -64 wireType cnt: 1 id: 64 wireType value cnt: 13 cnt: 1 id: 64 wireType と value の詳細がわかれば勝てそう value

Slide 45

Slide 45 text

debug 用のよさげな内部実装を発見 - 構造をパースして良さげに出力する debug 用の実装を発見 - みるかぎり単純に端っこから consume していって解釈してるだ けでとても読みやすい - この実装を追えば wireType と value の詳細がわかりそう!

Slide 46

Slide 46 text

cnt: 36 id: -64 wireType まずは wireType から読み取るぞ! この先スペースなさすぎに つきレイアウト変更

Slide 47

Slide 47 text

cnt: 36 id: -64 wireType id が負数なら type def と判断 debug 実装

Slide 48

Slide 48 text

cnt: 36 id: 64 wireType type def なら以下みたいな構造で パースされる(gob pkg で定義)

Slide 49

Slide 49 text

cnt: 36 id: 64 wireType 初期値 -1 で delta encoding されると 仕様で言及されてる debug 実装もそうなってる

Slide 50

Slide 50 text

cnt: 36 id: 64 wireType 0b11 = 3 delta encoding 初期値 -1 を考えて, field_number: 2 を表現 structType である! type def なら以下みたいな構造で パースされる(gob pkg で定義)

Slide 51

Slide 51 text

cnt: 36 id: 64 wireType 今回は StructT や! 0b11 = 3 delta encoding 初期値 -1 を考えて, field_number: 2 を表現 structType である!

Slide 52

Slide 52 text

cnt: 36 id: 64 wireType 今回は StructT や! 0b11 = 3 delta encoding 初期値 -1 を考えて, field_number: 2 を表現 structType である! debug 実装も 2 なら struct として食べ てる

Slide 53

Slide 53 text

cnt: 36 id: -64 wireType struct type はこんな感じ 0b11 = 3 delta encoding 初期値 -1 を考えて, field_number: 2 を表現 structType である!

Slide 54

Slide 54 text

cnt: 36 id: -64 wireType 説明のために簡略化してまとめるとこ んな感じ! 0b11 = 3 delta encoding 初期値 -1 を考えて, field_number: 2 を表現 structType である!

Slide 55

Slide 55 text

cnt: 36 id: -64 wireType 説明のために簡略化してまとめるとこ んな感じ! 0b11 = 3 delta encoding 初期値 -1 を考えて, field_number: 2 を表現 structType である! いまここ!

Slide 56

Slide 56 text

cnt: 36 id: -64 wireType ← の 1byte から 大まかな構造が わかる! 説明のために簡略化してまとめるとこ んな感じ! いまここ!

Slide 57

Slide 57 text

cnt: 36 id: -64 wireType 0b1 = 1 delta encoding 初期値 -1 を考えて, field_number: 0 説明のために簡略化してまとめるとこ んな感じ! いまここ!

Slide 58

Slide 58 text

cnt: 36 id: -64 wireType 0b1 = 1 delta encoding 初期値 -1 を考えて, field_number: 0 説明のために簡略化してまとめるとこ んな感じ! いまここ!

Slide 59

Slide 59 text

cnt: 36 id: -64 wireType 0b100 = 4 len: 4 string はよくある len が先に来て そのあと val があるパターン debug 実装

Slide 60

Slide 60 text

cnt: 36 id: -64 wireType 眼力で `item` とわかる string はよくある len が先に来て そのあと val があるパターン debug 実装

Slide 61

Slide 61 text

cnt: 36 id: -64 wireType 眼力で `item` とわかる ほんとはこれがある → string はよくある len が先に来て そのあと val があるパターン debug 実装

Slide 62

Slide 62 text

cnt: 36 id: -64 wireType = item ようはこう 眼力で `item` とわかる

Slide 63

Slide 63 text

cnt: 36 id: -64 wireType 次は id 0b1 = 1 delta encoding 初期値 -1, 直前が0なので, field_number: 1

Slide 64

Slide 64 text

cnt: 36 id: -64 wireType 次は id いまここ! 0b1 = 1 delta encoding 初期値 -1, 直前が0なので, field_number: 1

Slide 65

Slide 65 text

cnt: 36 id: -64 wireType 取り出して先頭bitが立ってなければ val 返す 立ってたら符号反転したものが len 数値も len のあと val っぽい ちょっと癖ある

Slide 66

Slide 66 text

cnt: 36 id: -64 wireType 取り出して先頭bitが立ってなければ val 返す 立ってたら符号反転したものが len 数値も len のあと val っぽい ちょっと癖ある 先頭bitが立ってるので len を表す int8(uint8(0xff)) = -1 反転して 1 len: 1

Slide 67

Slide 67 text

cnt: 36 id: -64 wireType とった len で値を読む (複数桁あったらいい感じに加算) int だったら最下位bitが立ってたら反転 zigzag encoding ぽいかんじ

Slide 68

Slide 68 text

cnt: 36 id: -64 wireType 1bit 右shift 末尾が立ってないからそ のまま 0b01000000 = 64 id: 64 とった len で値を読む (複数桁あったらいい感じに加算) int だったら最下位bitが立ってたら反転 zigzag encoding ぽいかんじ

Slide 69

Slide 69 text

cnt: 36 id: -64 wireType 1bit 右shift 末尾が立ってないからそ のまま 0b01000000 = 64 id: 64 とった len で値を読む (複数桁あったらいい感じに加算) int だったら最下位bitが立ってたら反転 zigzag encoding ぽいかんじ gob の数値は全部これ これで飛ばしてた 箇所も読める

Slide 70

Slide 70 text

cnt: 36 id: -64 wireType つぎは終端!common type おわり!

Slide 71

Slide 71 text

cnt: 36 id: -64 wireType ようはこう Name = item Id = 64

Slide 72

Slide 72 text

cnt: 36 id: -64 wireType ようはこう 解決ずみ ✅ Name = item Id = 64

Slide 73

Slide 73 text

cnt: 36 id: -64 wireType つぎは field 解決ずみ ✅ 0b1 = 1 delta encoding 初期値 -1, 直前が0なので, field_number: 1

Slide 74

Slide 74 text

cnt: 36 id: -64 wireType つぎは field 解決ずみ ✅ 0x10 = 2 先頭立ってないから そのまま値 len: 2

Slide 75

Slide 75 text

cnt: 36 id: -64 wireType つぎは field 解決ずみ ✅ 0b1 = 1 delta encoding 初期値 -1 を考慮して field_number: 0

Slide 76

Slide 76 text

cnt: 36 id: -64 wireType つぎは field 解決ずみ ✅ 0b100 = 4 len: 4

Slide 77

Slide 77 text

cnt: 36 id: -64 wireType つぎは field 眼力で `Name` 解決ずみ ✅

Slide 78

Slide 78 text

cnt: 36 id: -64 wireType つぎは field 解決ずみ ✅ 眼力で `Name`

Slide 79

Slide 79 text

cnt: 36 id: -64 wireType つぎは field 解決ずみ ✅ 解決ずみ ✅ 0b1 = 1 delta encoding 初期値 -1, 直前が0なので, field_number: 1

Slide 80

Slide 80 text

cnt: 36 id: -64 wireType つぎは field 解決ずみ ✅ 解決ずみ ✅ 0b1100 = 6 先頭立ってないから 値, 末尾0で反転なし val: 6

Slide 81

Slide 81 text

cnt: 36 id: -64 wireType つぎは field 解決ずみ ✅ 解決ずみ ✅ 終端

Slide 82

Slide 82 text

cnt: 36 id: -64 wireType つまりひとつめの field は... 解決ずみ ✅ 解決ずみ ✅ 終端 Name = Name Id = 6

Slide 83

Slide 83 text

cnt: 36 id: -64 wireType つまりひとつめの field は... 解決ずみ ✅ 解決ずみ ✅ 終端 Name = Name Id = 6 👍

Slide 84

Slide 84 text

cnt: 36 id: -64 wireType ふたつめの field ! (サボります) 解決ずみ ✅ 解決ずみ ✅ Name = Price Id = 4 終端

Slide 85

Slide 85 text

cnt: 36 id: -64 wireType ふたつめの field ! (サボります) 解決ずみ ✅ 解決ずみ ✅ Name = Price Id = 4 終端 👍

Slide 86

Slide 86 text

cnt: 36 id: -64 wireType あとは終端! 解決ずみ ✅ 解決ずみ ✅ 終端

Slide 87

Slide 87 text

cnt: 36 id: -64 wireType あとは終端! 🎉🎉🎉🎉 終端

Slide 88

Slide 88 text

つぎは value を! cnt: 14 cnt: 1 id: 64 value

Slide 89

Slide 89 text

cnt: 14 cnt: 1 id: 64 value 余談: さっき skip したこまいところもいまは読める 先頭立ってるから len, 符号反転して len: 1

Slide 90

Slide 90 text

cnt: 14 cnt: 1 id: 64 value 1bit 右 shift して 0b01000000 末尾0だから 64 余談: さっき skip したこまいところもいまは読める

Slide 91

Slide 91 text

cnt: 14 cnt: 1 id: 64 value id: 64 の構造は これ 構造をみていく

Slide 92

Slide 92 text

cnt: 14 cnt: 1 id: 64 value id: 64 の構造は これ 構造をみていく ようはこれがわかればよい

Slide 93

Slide 93 text

cnt: 14 cnt: 1 id: 64 value id: 64 の構造は これ id が負数でないので val で解釈 debug 実装

Slide 94

Slide 94 text

cnt: 14 cnt: 1 id: 64 value id: 64 の構造は これ wireType によってちょっと挙動がかわる debug 実装

Slide 95

Slide 95 text

cnt: 36 id: -64 wireType id: 64 はこんな感じの型だったのを思い出して 🎉🎉🎉🎉

Slide 96

Slide 96 text

cnt: 14 cnt: 1 id: 64 value id: 64 の構造は これ wireType によってちょっと挙動がかわる こっちを通る

Slide 97

Slide 97 text

cnt: 14 cnt: 1 id: 64 value どんな感じで評価する? debug 実装

Slide 98

Slide 98 text

cnt: 14 cnt: 1 id: 64 value どんな感じで評価する? debug 実装 delta encoding field num

Slide 99

Slide 99 text

cnt: 14 cnt: 1 id: 64 value どんな感じで評価する? debug 実装 field num に登録された型でパース

Slide 100

Slide 100 text

cnt: 14 cnt: 1 id: 64 value Name field 0b1 = 1 delta encoding 初期値 -1 を考慮して field_number: 0

Slide 101

Slide 101 text

cnt: 14 cnt: 1 id: 64 value Name field len: 6

Slide 102

Slide 102 text

cnt: 14 cnt: 1 id: 64 value Name field Name: banana

Slide 103

Slide 103 text

cnt: 14 cnt: 1 id: 64 value Name field Name: banana 👍

Slide 104

Slide 104 text

cnt: 14 cnt: 1 id: 64 value Price field 0b1 = 1 delta encoding 初期値 -1, 直前0を考慮して field_number: 1

Slide 105

Slide 105 text

cnt: 14 cnt: 1 id: 64 value Price field 先頭bitが立ってるので len を表す int8(uint8(0xff)) = -1 反転して 1 len: 1

Slide 106

Slide 106 text

cnt: 14 cnt: 1 id: 64 value Price field 1bit 右shift 末尾が立ってないからそ のまま 0b01100100 = 100 val: 100

Slide 107

Slide 107 text

cnt: 14 cnt: 1 id: 64 value Price field 1bit 右shift 末尾が立ってないからそ のまま 0b01100100 = 100 val: 100 👍

Slide 108

Slide 108 text

cnt: 14 cnt: 1 id: 64 value item type の値を読み切った!! 終端 🎉🎉🎉🎉

Slide 109

Slide 109 text

宿題: 2こめの val 自分で読んでみてね cnt: 13 cnt: 1 id: 64 value

Slide 110

Slide 110 text

gobの性質の評価

Slide 111

Slide 111 text

今回は以下の観点で gob を評価 - パフォーマンス - サイズ - 後方/前方互換性 - 自己言及的 (self-describing) であるか - エコシステム - etc …

Slide 112

Slide 112 text

今回は以下の観点で gob を評価 性質 \ encoding gob json protobuf (wire) サイズ 前方/後方互換性 自己言及的か エコシステム

Slide 113

Slide 113 text

ざっくりこんなレイアウトだったのを思い出そう cnt: 14 cnt: 36 id: -64 wireType cnt: 1 id: 64 wireType value cnt: 13 cnt: 1 id: 64 value

Slide 114

Slide 114 text

型定義も含むため val 1こなら json の方が安い

Slide 115

Slide 115 text

val 単体なら gob の方が安い

Slide 116

Slide 116 text

単一 stream 内では型定義は 1つしか流れないの で stream で使おう!

Slide 117

Slide 117 text

サイズはこんな感じ 性質 \ encoding gob json protobuf (wire) サイズ 🔺 stream で上手 く使えば小さい ❌ 比較的大きい ⭕ 小さい 前方/後方互換性 自己言及的か エコシステム

Slide 118

Slide 118 text

cnt: 36 id: -64 wireType 眼力で `Name` フィールド名を含めた型情報を持っている ことを思い出そう

Slide 119

Slide 119 text

フィールド名を変えると値が取れなくなる - のでおおよそ互換性については json と同じ性質を持っていそう - ただ gob はアプリケーション側の型の差分についてはわりといい感じにし てくれる - ポインタあるなしとか、フィールドなかったら単に無視とか - protobuf(wire) と違って具体的なフィールド名などが露出するので、命 名変えた時とかは気をつけないと過去のメッセージから値を取り出せない

Slide 120

Slide 120 text

互換性 性質 \ encoding gob json protobuf (wire) サイズ 🔺 stream で上手 く使えば小さい ❌ 比較的大きい ⭕ 小さい 前方/後方互換性 🔺 Go の型は多少 うまくしてくれる ❌ なし ⭕ filed_num の み露出 自己言及的か エコシステム

Slide 121

Slide 121 text

cnt: 36 id: -64 wireType 完全な型情報を持つことを思い出そう

Slide 122

Slide 122 text

自己言及的か 性質 \ encoding gob json protobuf (wire) サイズ 🔺 stream で上手 く使えば小さい ❌ 比較的大きい ⭕ 小さい 前方/後方互換性 🔺 Go の型は多少 うまくしてくれる ❌ なし ⭕ filed_num の み露出 自己言及的か ⭕⭕ 完全な型情 報を持ち実装の高 度なサポートあり 🔺~ ⭕ 構造の情 報あり 🔺 6種類くらいの 大まかな種別あり エコシステム

Slide 123

Slide 123 text

エコシステムは ...? - json はどこでも使える - protobuf(wire) は高度なエコシステムのサポートがある - 一方 gob は現時点で Go からしか使えない! - 言語埋め込みだから実現できる高度な機能とのトレードオフ - 理屈上他言語にも実装できるから、どうしても困ったら最悪そうすればえ えかくらい

Slide 124

Slide 124 text

こうなった! 性質 \ encoding gob json protobuf (wire) サイズ 🔺 stream で上手 く使えば小さい ❌ 比較的大きい ⭕ 小さい 前方/後方互換性 🔺 Go の型は多少 うまくしてくれる ❌ なし ⭕ filed_num の み露出 自己言及的か ⭕⭕ 完全な型情 報を持ち実装の高 度なサポートあり 🔺~ ⭕ 構造の情 報あり 🔺 6種類くらいの 大まかな種別あり エコシステム ❌ Go だけ ⭕ どこでもOK ⭕ そこそこ使える し周辺ツールが発 展してる

Slide 125

Slide 125 text

性質 \ encoding gob json protobuf (wire) サイズ 🔺 stream で上手 く使えば小さい ❌ 比較的大きい ⭕ 小さい 前方/後方互換性 🔺 Go の型は多少 うまくしてくれる ❌ なし ⭕ filed_num の み露出 自己言及的か ⭕⭕ 完全な型情 報を持ち実装の高 度なサポートあり 🔺~ ⭕ 構造の情 報あり 🔺 6種類くらいの 大まかな種別あり エコシステム ❌ Go だけ ⭕ どこでもOK ⭕ そこそこ使える し周辺ツールが発 展してる gob はどういうときに使えるか

Slide 126

Slide 126 text

性質 \ encoding gob json protobuf (wire) サイズ 🔺 stream で上手 く使えば小さい ❌ 比較的大きい ⭕ 小さい 前方/後方互換性 🔺 Go の型は多少 うまくしてくれる ❌ なし ⭕ filed_num の み露出 自己言及的か ⭕⭕ 完全な型情 報を持ち実装の高 度なサポートあり 🔺~ ⭕ 構造の情 報あり 🔺 6種類くらいの 大まかな種別あり エコシステム ❌ Go だけ ⭕ どこでもOK ⭕ そこそこ使える し周辺ツールが発 展してる これが許容できて gob はどういうときに使えるか

Slide 127

Slide 127 text

性質 \ encoding gob json protobuf (wire) サイズ 🔺 stream で上手 く使えば小さい ❌ 比較的大きい ⭕ 小さい 前方/後方互換性 🔺 Go の型は多少 うまくしてくれる ❌ なし ⭕ filed_num の み露出 自己言及的か ⭕⭕ 完全な型情 報を持ち実装の高 度なサポートあり 🔺~ ⭕ 構造の情 報あり 🔺 6種類くらいの 大まかな種別あり エコシステム ❌ Go だけ ⭕ どこでもOK ⭕ そこそこ使える し周辺ツールが発 展してる この性質を強く 求めていて gob はどういうときに使えるか

Slide 128

Slide 128 text

性質 \ encoding gob json protobuf (wire) サイズ 🔺 stream で上手 く使えば小さい ❌ 比較的大きい ⭕ 小さい 前方/後方互換性 🔺 Go の型は多少 うまくしてくれる ❌ なし ⭕ filed_num の み露出 自己言及的か ⭕⭕ 完全な型情 報を持ち実装の高 度なサポートあり 🔺~ ⭕ 構造の情 報あり 🔺 6種類くらいの 大まかな種別あり エコシステム ❌ Go だけ ⭕ どこでもOK ⭕ そこそこ使える し周辺ツールが発 展してる かつ json, protobuf (wire) の中間みたいな  バランスが噛み合う用途 gob はどういうときに使えるか

Slide 129

Slide 129 text

gob はどういうときに使えるか - Go でしか使えない制約を受け入れられるとき - 検証用途のコードで使うとか - データライフサイクルが短いもの - キャッシュとか - RPC やりとりの encoding として - 後述するメリットとバランスがとれるとき

Slide 130

Slide 130 text

- Go でしか使えない制約を受け入れられるとき - 検証用途のコードで使うとか - データライフサイクルが短いもの - キャッシュとか - RPC やりとりの encoding として - 後述するメリットとバランスがとれるとき gob はどういうときに使えるか じつは標準の net/rpc と かでも使われてる

Slide 131

Slide 131 text

gob の嬉しい性質 - Go で完結してすぐ使えて嬉しい - 大抵嬉しいと思う - Go でしか使えないこととのトレードオフという感じ - そこそこ効率がよかったり、まあまあメッセージの互換性が取れることが嬉しい - デメリットとバランスするなら採用余地あり!

Slide 132

Slide 132 text

まとめ

Slide 133

Slide 133 text

まとめ - みんなでバイナリを読んで gob を完全理解しました - 大体どれもこんな感じなんで興味あったら protobuf (wire) の spec も読ん でみてください - encoding 仕様からいくつかの性質について整理した - gob が使えそうなところや, 採用した時の嬉しさを整理した - キャッシュやRPCにおすすめ - Go から便利に使えること, その他の性質が程よいところがメリット - pros/cons 整理してバランスするならいい選択肢

Slide 134

Slide 134 text

みんなでバイナリを読もう!

Slide 135

Slide 135 text

Slide 136

Slide 136 text

ご清聴ありがとうございました