はじめに
調べていると、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でデータを保持する上でメモリを使う必要があります。 そのため、このような使い分けをするといいようです。