osio_sioの日記

自分用メモ

GOの`json.Unmarshal`と`json.NewDecoder`の違い

はじめに

調べていると、JSON ファイル → Go オブジェクトの際に、このサイトのようにNewDecoderを使う場合と、このサイトのようにUnmarshalを使う場合があり、違いがよくわからなかったのでまとめてみました✍️

参考記事:https://qiita.com/Coolucky/items/44f2bc6e32ca8e9baa96

結論

記事にある通りなのですが、 ストリームから情報を読み込んだ時はjson.NewDecoder、 それ以外の場合はjson.Unmarshalを使います。

理由

ストリームから情報を読み込んだ時は、json.Unmarshal() ではデータを途中で持たなくてはならないため、基本NewDecoderを使うことになるようです(一応 json.NewDecoder() も内部的にデータを持っているが、データの持ち方が効率化されているので、こちらの方が良いらしい)。

イメージとしては、
NewDecoderの場合
ファイル→(os.Open()) →io.Reader →json.NewDecoder()→data
Unmarshalの場合
ファイル→(os.ReadFile())→byte →json.Unmarshal →data

といった流れになっていて、上の場合はjson.NewDecoderでデータの読み取り、structへのmapを行っています。一方下の場合はos.ReadFile()でデータの読み取りを行い、json.Unmarshal()でstructへのmapを行っていて、byteでデータを保持する上でメモリを使う必要があります。 そのため、このような使い分けをするといいようです。