1
0

More than 3 years have passed since last update.

ときにはencoding.TextUnmarshalerの話を

Posted at

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

うんざり

最近いろいろなプライベートプロジェクトに参加したりしてるんですが、
あっちにいってもこっちにいっても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はかわいいですね。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0