はじめに
golangでよく使う構造体ですが、特定のフィールドの初期値を0やfalseではなく、nilにしたい場合ってありませんか?
ポインタ型で指定することで、簡単にできるので共有しておきます。
いきなり結論のコード
コード全体
package main
import "fmt"
type a struct {
valueA int
}
type b struct {
valueB *int
}
func main(){
var sa a
var sb b
fmt.Println(sa,sb) // => {0} {<nil>}
}
解説
1つ目の構造体では普通にint
型を指定、2つ目の構造体ではint
のポインタ型を指定しています。
type a struct {
valueA int
}
type b struct {
valueB *int
}
下の通り、宣言だけしてそのまま実行すると、初期値が出力されます。
var sa a
var sb b
fmt.Println(sa,sb) // => {0} {<nil>}
出力結果が、2つの構造体で違います。
1つ目の構造体は、初期値が0なのに対して、2つ目の構造体は初期値がnilになっています。
使用例
もしかしたら、あまり違いがないと感じられる方もいるかもしれませんが、実はこれはとても大きく違います。
たとえば、以下のような構造体で、User
の値を管理したい場合。
type User struct {
lastname string
firstname string
age uint64
}
lastname
は「鈴木」、firstname
は「太郎」、age
はいったん空けておきたい…なんて場合があったとします。
var u User
u.lastname = "鈴木"
u.lastname = "太郎"
実はこれで実行すると、u.age
にはint型の初期値である0が入ってしまいます。
こうなると、このユーザーが本当に0歳のなのか、それとも年齢が分からないので空けていたユーザーなのかが、わかりません。
これはまずい。
こんなときに、
type User struct {
lastname string
firstname string
age *uint64
}
このようにポインタ型で指定してあげると、u.age
には初期値nil
が入るので、とても便利。
0歳か不明なのか分からない…といったことが無くなります。
&User{
lastname : "鈴木",
firstname: "太郎",
age : nil,
}
&User{
lastname : "鈴木",
firstname: "太郎",
age : 0,
}
bool型もnilにできる
ちなみに、フラグとして使うことも多いbool型でも、初期値をfalseにすることなく使えたりします。
試してみて下さい。
さいごに
最後まで読んで頂いてありがとうございます。
今日は、構造体の初期値をnilにする方法について、共有致しました。
また、不備があればコメント頂けると嬉しいです。