【Go言語】構造体でオプションパラメータのように振る舞う機能を作る方法

Go言語にはオプションパラメータの機能はありません。しかし、構造体のインスタンス化関数に別の構造体を使ってオプションパラメータを表現することができます。

構造体を使用するとフィールドが欠落している場合そのフィールドの既定値を設定することができます。if文で地道に設定していく感じです。

それでは以下がオプションパラメータのサンプルコードです。

type MyStruct {
   Field1 string
   Field2 int
   Field3 bool
}

type Options struct {
    Field1 string
    Field2 int
    Field3 bool
}

func NewWithOptions(options Options) *MyStruct {
    // パラメータが欠落している場合、既定値を設定する
    if options.Field2 == 0 {
        options.Field2 = 10
    }
    if options.Field3 == false {
        options.Field3 = true
    }

    // MyStructを初期化する
    myStruct := &MyStruct{
        Field1: options.Field1,
        Field2: options.Field2,
        Field3: options.Field3,
    }

    return myStruct
}

// 以下のように使用できる
options := Options{
    Field1: "foo",
}
myStruct := NewWithOptions(options)

上の例ではOptions構造体を定義してNewWithOptions関数を定義しています。NewWithOptions関数では、Options構造体をパラメータとして受け取り、フィールドが欠落している場合は既定値を設定し、MyStructを初期化して返します。

Options構造体を使用すると必要なフィールドのみを設定し他のフィールドは既定値に任せることができます。

まとめ

PHPやRubyなどを使い慣れているエンジニアにとっては少し冗長というか手間のかかるコードですが、このようにして構造体にオプションパラメータのように振る舞う機能を作ることができます。