🗂
ときにはencoding.TextUnmarshalerの話を
飛ばねえホリネズミはただのホリネズミだ…
うんざり
最近いろいろなプライベートプロジェクトに参加したりしてるんですが、
あっちにいってもこっちにいっても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