今回はgolangのnull.intについて解説していきます。
null.intとは
golangの標準パッケージに「null」というライブラリがあります。
この「null」パッケージではSQLやJSONに意図的にnullを入力したい場合に使います。golangにはゼロ値が設定されていて、intであれば「0」、stringであれば「””」に初期化されてしまいます。
このままではDBのint型のカラムに意図的にnullを入れたくても0が入ってしまいます。つまり意味のある0なのか意味のない0なのか判別できないためnullをInsertやUpdateしていいか分かりません。
そんなときに使用するのが今回紹介するnull.intです。
null.intの使い方
まずはnullパッケージをインストールします。
go get github.com/guregu/null
これでgoプロジェクトでnullパッケージを使用することができます。
null.intの宣言は以下のように行います。
func main() {
var a null.Int
fmt.Println(a)
}
この実行結果は{{0 false}}
null.IntはInt64(int64)とValid(bool)が格納されたNullInt64というstructを返します。
今回はint型の変数aに何も値を入れていないため、返却値のstructはゼロ値である0とnilであることを意味するfalseとなります。
次に意味のある0を変数に入れる場合のnull.intの宣言は以下のようになります。
func main() {
a := null.NewInt(0, true)
fmt.Println(a)
}
null.NewIntの中身を見てみると、引数にint64とboolを渡す必要があります。
// NewInt creates a new Int
func NewInt(i int64, valid bool) Int {
return Int{
NullInt64: sql.NullInt64{
Int64: i,
Valid: valid,
},
}
}
渡した引数をそのままInt64(int64)とValid(bool)が格納されたNullInt64というstructが返ってきます。
つまり今回の実行結果は{{0 true}}となり、0がnilではなく意味のある0ということがわかります。
int型からnull.int型に変換
では次に既にint型の変数が存在する場合にnull.int型に変換する方法を紹介します。
null.IntFrom()を使うことでint型からnull.int型に変換することができます。
func main() {
var a int64 = 5
fmt.Println(a)
b := null.IntFrom(a)
fmt.Println(b)
}
int64型の5が格納されているaに対し、null.IntFrom()でnull.int型に変換します。
こちらの実行結果は5 {{5 true}}となり、null.int型に変換されています。
null.int型からint型に変換
逆にnull.int型からint型に変換する方法について紹介します。
こちら非常に簡単です。
func main() {
a := null.NewInt(6, true)
fmt.Println(a)
b := a.Int64
fmt.Println(b)
}
何かの関数を使うことなく、null.int内のプロパティを指定することでint64型の値を取得することができます。
このコードの実行結果は{{6 true}} 6と変換できていることがわかります。
golangをもっと詳しくなりたい方に
golang学習のために筆者が実際に受講したUdemy教材をまとめています。
golang学習のために筆者が実際に読んでおすすめしたい本をまとめています。