Closed4

Go言語のnilと、JSONのNULLと、MySQLのNULLの関係性を試してみたのでメモ

yuto-myuto-m

結論
Go言語のnilは、JSONのNULLとして解釈されるし、MySQLにもNULLとして解釈される。
図にすると下記になるイメージ。

nil(Go) <-> NULL(JSON)
nil(Go) <-> NULL(MySQL)
yuto-myuto-m

JSONの補足メモ
気になっていたJSONをGoの構造体にマッピングした際に、ゼロ値が入る理由を言語化すると下記の理由ぽかった。
公式ドキュメントにも書いてある。

JSONのNULL値をGoの構造体に変換すると、nilになる。
そしてmappingする構造体のフィールドの型がnilを入れられば(ex. ポインタ型)nilが設定され、無理なら(ex. int型)ゼロ値になる。

具体例は下記。

  • nilがマッピングできずに、ゼロ値になる具体例
  • nilがマッピングできて、nilが設定される具体例

上記とは逆に、Goのnil値をJSONにmappingするとNULL値になる。これは上記の逆でGoのnil値をNULLとして解釈するようになっているから。
公式ドキュメントにも書いてある。
具体例はこちら

yuto-myuto-m

MySQL補足メモ

  • Goのnil値を、NULL許容のテーブルにInsertするとNULlとして保存される。具体例はこちら
    • ChatGPT曰く、nil値をNULLとしてDBに保存する仕組みは、Goのデータベースドライバが提供しているとのこと。
    • 逆にNULLをGoの構造体にマッピングするにはnilが設定できる型(ex. ポインタ型)にする必要がある。
    • ポインタ型にしていない場合は下記のようにエラーが表示された。具体例はこちら(エラーになるので具体例に意味はない。あくまでイメージ的な実装)。
sql: Scan error on column index 1, name "age": converting NULL to int is unsupported
yuto-myuto-m

下記の関係性は直感的だと思うけど、JSONを構造体にする時にnilが入らない型の場合はゼロ値が入るっていうのはたまに気になってたので理解できて良かった。

nil(Go) <-> NULL(JSON)
nil(Go) <-> NULL(MySQL)
このスクラップは2023/07/23にクローズされました