お世話になっております。
しゃまとんです。

タイトルの通りですが、ZeroFormatterをGo言語で使えるようにしたかったので、作ってみています。

そもそもZeroFormatterとは何ぞやというところですが、infinityにFastなDeserializerです。
C#でserialize/deserializeを爆速で行えるようで、これはすごい・・・!と思った次第です。

詳細はgithubで。

そんなZeroFormatterはもちろんUnityでも使用することができます(zfc等の若干の利用手順があるっぽい)。 作者のneueccさんが所属されているグラニさんで使われているはずなので、実績はこれから積まれていくでしょう。

現状、多言語対応は進行中(有志によって)なので、他言語で使いたい場合は待つか、 フォーマットが公開されているので実装する必要があります。
golangでも誰かやってくれないかなーと思っていたのですが、 いなかったのでやり始めてみたのがきっかけです。使えたら面白いんじゃないか的な。

対応状況はリポジトリを見ていただくのがいいのですが、ざ っくりいうとプリミティブな型に関してはある程度対応するところまで出来ました。 それと少しばかりのチューニングをし、ざっくりとしたベンチマークを取ってみました。

type BenchChild struct {
    Int    int
    String string
}

type BenchMarkStruct struct {
    Int    int
    Uint   uint
    Float  float32
    Double float64
    Bool   bool
    String string
    Array  []int
    Map    map[string]int
    Child  BenchChild
}

var s = BenchMarkStruct{
    Int:    -123,
    Uint:   456,
    Float:  1.234,
    Double: 6.789,
    Bool:   true,
    String: "this is text.",
    Array:  []int{1, 2, 3, 4, 5, 6, 7, 8, 9},
    Map:    map[string]int{"this": 1, "is": 2, "map": 3},
    Child:  BenchChild{Int: 123456, String: "this is struct of child"},
}

比較は日本でよく使われているっぽいMessagePackと。
ちなみにパッケージはvmihailenco/msgpackを使いました。

BenchmarkPackZeroformatter-4          500000          2919 ns/op         760 B/op         14 allocs/op
BenchmarkPackMsgpack-4                200000          6416 ns/op        1000 B/op         14 allocs/op
BenchmarkUnpackZeroformatter-4        300000          3482 ns/op         976 B/op         29 allocs/op
BenchmarkUnpackMsgpack-4              200000          8353 ns/op        1024 B/op         33 allocs/op

結果としてはMsgPackよりも処理速度はおよそ半分ぐらいになりました。 今後の更新で変わるかもしれないのですが。。。

今後としては、本家がデシリアライズしない仕組みになっているので、 こちらでいい感じに…は難しいので明示的にでもやれるようにしようかなと思っています。 それとタグ指定で構造体の特定のプロパティのみ評価対象にできるようにしたいと思っています。

それとmapのシリアライズがMsgPackに比べて遅い感じがあるので、改善する予定です。
ということで報告みたいな感じですが、以上です。