Golang database/sql 検索時のNULLの扱いで、interface {} を使う

1.NULLの扱い方のチュートリアル等での例での疑問

Golangのチュートリアル等で、database/sql パッケージの型である、sql.NullString、
sql.NullInt64等を利用した例が検索で引き当たる。
サンプルでは、取り出し、Printするところまでは、記述されている。

だが、実際のアプリケーションは、それで終わりではない。

2.何がいいたいか

取り出した値をStructで定義したfield等に代入したりすることになれば、
そこで型変換を行うことになる。
そもそも、nullの型とintまたはstringの型を同じ変数に入れようとすると
interface型を使用することになる。

要は、sql.NullString、sql.NullInt64等の型を加えると、混乱するだけ。

3.ではどうするか?

sql.NullString、sql.NullInt64等を使用しなくても、Null値はinterface型で判定できる。
取り出したときの判定とType変換が必要だが、この変換codeは直観的に理解できる。

つまり、最初からinterface {} で取り出した方が簡単だということ。

4.interface型で取り出した値
・null は nilになる

従って、値が nilかどうか判定して、目的のTypeに変換してやれば良い。

5.step

(1) db.QueryのSELECT文で、interface型で取り出す
(2) 次に、取り出した値がnilかどうかで判定する
(3) 値がnilでなければ、目的の型に変換する

6.codeの書きやすさ

sql.NullString、sql.NullInt64等を利用するより、コードを書いていてすっきりする。

6.code
・例のtax_idは、DBのtableのcolumn定義でnull or stringの前提

type tax_id_s struct {
    Tax_id  interface{} `json:"tax_id"`
}
・・・
   var _r tax_id_s;

   SQL := `
      SELECT
         tax_id,
      FROM
         taxt_list
   `;

   rows, _ := auth_db.Query(s.String())

   for rows.Next() {
      _ = rows.Scan( &_r.Tax_id )

      if _r.Tax_id != nil {
         _r.Tax_id = fmt.Sprintf("%s", _r.Tax_id);
      }
   }
・・・