Go言語でJSONを作成したときのイージーミス

May 11, 2018   #golang  #json 

はじめに

Go言語を使って構造体をJSON形式に変換しようとしたら詰まったのでメモです。
JSON形式への変換は標準パッケージに含まれているjson.Marshalを使っています。

失敗例

こんな感じで構造体のスライスをJSONにしようとしたところ、作成されたJSONの中身が空になっていました。

成功例

原因がわからなかったので色々と試行錯誤した結果、下記のコードで想定した動きを確認することができました。 失敗例では10〜12行目の構造体のフィード名の先頭文字を小文字にしていましたが、成功例では先頭文字を大文字に変えています。

原因

ここまで書けば原因がわかる方も多いと思いますが…
Go言語では変数や関数のスコープが先頭文字列が小文字か、大文字かで判定されます。 先頭文字が大文字の場合は他パッケージからの参照が可能(いわゆるpublic)、先頭文字が小文字の場合は他パッケージから参照不可(いわゆるprivate)となります。 このルールは構造体のフィードにも適用されます。
そのため、失敗例では構造体のフィードに対してパッケージ外からアクセスすることができず、作成されたJSONが空っぽになっていました。

ちなみに

作成されるJSONのKeyを先頭小文字にしたい場合、以下のようにフィードに対してタグをつけることで任意の名前を指定することができます。

おわりに

初歩的なミスでしたが原因に気づくまで時間がかかってしまいました。 前に触ったことがあるはずなんですが…先頭文字でスコープが変化するのは慣れないと忘れちゃいますね。
コンパイルエラーとかで教えてくれないかなぁ。