Help us understand the problem. What is going on with this article?

[Golang]構造体でフィールドの初期値を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はいったん空けておきたい…なんて場合があったとします。

使用例:User情報を入力
    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,
}
0歳のときの構造体
&User{
    lastname : "鈴木",
    firstname: "太郎",
    age      : 0,
}

bool型もnilにできる

ちなみに、フラグとして使うことも多いbool型でも、初期値をfalseにすることなく使えたりします。
試してみて下さい。

さいごに

最後まで読んで頂いてありがとうございます。
今日は、構造体の初期値をnilにする方法について、共有致しました。
また、不備があればコメント頂けると嬉しいです。

riotam
僕が、学んだり、困ったことを共有して、誰かの役に立てれば嬉しいです。 ペーペーですが、よろしくお願いします。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした