Goの構造体(struct)にデフォルト値を設定する3つの方法

Go言語の構造体にデフォルト値を設定する方法はいくつかあります。

デフォルト値を設定するというのは、他の言語ならだいたいクラスをインスタンス化するときにコンストラクタ関数でやるような処理ですよね。

僕は1番目の方法が、他の言語に感覚的に近い & 記述量が少なくて済むので使っています。

それでは解説していきます。

コンストラクタ関数で構造体にデフォルト値を設定する方法

この方法では構造体のコンストラクタ関数を作ってデフォルト値を設定する方法です。

type Employee struct {
  firstName string
  lastName string
  age int
}

// コンストラクタ関数を定義する
func NewEmployee(firstName, lastName string) *Employee {
  // デフォルト値を設定する
  return &Employee{
    firstName: firstName,
    lastName: lastName,
    age: 25, // デフォルト値
  }
}

// コンストラクタ関数を使って structs を作る
emp1 := NewEmployee("John", "Doe")
emp2 := NewEmployee("Jane", "Doe")

正直、これでいいと思っています。他にもいいのあるよって方いたらコメントで教えていただけると幸いです。

Go言語のスキルチェック

このほか、Go言語の細かいけど実践で役立つプログラミングのクイズを作ってみました!

 

\知識が身に付く、スキルチェックができる!/

 

Init関数を使う方法

次にInit() 関数を使って構造体を初期化する方法です。

init関数とはGo言語のパッケージを初期化するときに実行される特殊な関数です。

この方法でも構造体のフィールドにデフォルト値を設定できますが、コンストラクタ関数よりも記述が面倒なので僕は嫌いです。

これはサンプルコードを見てもらうのが理解が早そうです。

type Employee struct {
  firstName string
  lastName string
  age int
}

// Init() 関数を定義する
func (e *Employee) Init(firstName, lastName string) {
  // デフォルト値を設定する
  e.firstName = firstName
  e.lastName = lastName
  e.age = 25 // デフォルト値
}

// Init() 関数を使って構造体を初期化する
emp1 := &Employee{}
emp1.Init("John", "Doe")

emp2 := &Employee{}
emp2.Init("Jane", "Doe")

 

構造体のタグを使う方法

構造体にはタグという機能があります。

このタグを使う方法ではデフォルト値を設定できますが設定できる値はstring型のみ

タグは構造体のフィールドの後にバッククォートで囲まれたメタデータです。使う時にreflectパッケージでその情報を取得し利用したりします。

構造体のタグはキー:"値"の形式でメタ情報を受けることができます。これにdefaultというタグ(名前は何でもいい)を付けたサンプルコードはこちらです。

type Employee struct {
  firstName string `default:"John"`
  lastName string `default:"Doe"`
  age int `default:"25"`
}

// struct タグを読み取る関数を定義する
func GetDefaultTagValue(t reflect.Type, fieldName string) string {
  field, _ := t.FieldByName(fieldName)
  return field.Tag.Get("default")
}

// struct タグを使って structs を作る
emp1 := &Employee{}
emp1.firstName = GetDefaultTagValue(reflect.TypeOf(*emp1), "firstName")
emp1.lastName = GetDefaultTagValue(reflect.TypeOf(*emp1), "lastName")
emp1.age, _ = strconv.Atoi(GetDefaultTagValue(reflect.TypeOf(*emp1), "age"))

タグは便利なんですけど、デフォルト値を設定して使うだけのためにかなりコード量を書かないといけません。

クソ面倒くさいので僕はこういう書き方はしてないです。

 

まとめ

迷ったら1番目のコンストラクタ関数を使うのがいいと思います。

Go言語のスキルチェック

このほか、Go言語の細かいけど実践で役立つプログラミングのクイズを作ってみました!

\知識が身に付く、スキルチェックができる!/