🗂

ときにはencoding.TextUnmarshalerの話を

2021/08/04に公開

飛ばねえホリネズミはただのホリネズミだ…

うんざり

最近いろいろなプライベートプロジェクトに参加したりしてるんですが、
あっちにいってもこっちにいってもMarshalXXXだのString()だの実装するのDARUすぎませんか。
ここはJSONだからMarshalJSON実装して、こっちはYAMLだからMarshalYAML実装して…
アッ、素敵なHogeフォーマットなんてものを考えたんですね。じゃあMarshalHoge実装しなきゃですね(にっこり)

だいたいGoだとPrimitiveな型をtype Hoge intとかやりがちなんで、
書くモンが多い多い。

type Hoge int

func (h Hoge) MarshalJSON() ([]byte, error) {
...
}


func (h Hoge) UnmarshalJSON(raw []byte) error {
...
}

func (h Hoge) MarshalYAML() ([]byte, error) {
...
}

func (h Hoge) UnmarshalYAML(raw []byte) error {
...
}

func (h Hoge) MarshalHoge() ([]byte, error) {
...
}

func (h Hoge) UnmarshalHoge(raw []byte) error {
...
}

何を書かされてるんだ

encoding.TextUnmarshalerで良くない?

いちいち新しいフォーマット作るたびに、

type HogeUnmarshaler interface {
  UnmarshalHoge([]byte) error
}

とか新しいインターフェイスを作るだけじゃなくて、
primitiveなものならencoding.TextUnmarshalerをサポートしてあげましょう

環境変数パーサもArgs/Flagパーサも、オレオレプロトコルパーサーも、作るときには
encoding.TextUnmarshalerのことを思い出してあげてください

ついでに

encoding.BinaryUnmarshalerなんてもんもあります。
Gopherはかわいいですね。

Discussion