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); } } ・・・