[Go] 構造体でフィールドの初期値をnilにするには、そのフィールドをポインタ型にすれば良い件

はじめに

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にする方法について、共有致しました。
また、不備があればコメント頂けると嬉しいです。

PON3

PON3

5年くらい前に、30代完全未経験から独学でWeb系のソフトウェアエンジニアになった人。 現在はフリーランスエンジニアとして、大阪の自宅からフルリモートで東京の自社開発企業のお仕事をしている。 主戦場はバックエンドで、Go言語でのAPI開発や、Pythonでのデータ分析が武器。 とは言いつつ、フロントエンドをSPAを実装したり、IaCでクラウドインフラの設計構築したり、スクラム開発でプロジェクト運営したりするなんでも屋。 いつも、ググってきては誰かが書いてくれた記事を見て開発していたが、もらってばかりでなく世の中に返すこともしたいと思い、技術ブログをはじめる。 妻と2歳になる娘の3人暮らし。 何かご用件がある方は、TwitterのDMからどうぞ。