1.6 関数のオプション引数

関数やメソッドを実装するとき、必要に応じてパラメーターを増減させて、柔軟なロジックを実装したいことがあります。Goの文法に可変長引数はありますが、引数の数は変更できても、それぞれの型は同一である必要があります。パラメーターの型にバリエーションがある場合は別の方法が必要です。 Goには、Pythonのようなキーワード引数といったオプション引数のための文法はありませんし、JavaやC++のような関数オーバーロードもありません。ですが、いくつかの標準ライブラリや人気のライブラリで使われている技法があります。

ここではうどん屋のオプションを題材に、Goで関数のオプション引数を実現する方法を紹介します。次のような、すべてのパラメーターを渡さなければならない関数があるとして、これをいかに使いやすいものにできるかが、本節のゴールです。

type Portion int

const (
	Regular Portion = iota // 普通
	Small                  // 小盛り
	Large                  // 大盛り
)

type Udon struct {
	men      Portion
	aburaage bool
	ebiten   uint
}

// 麺の量、油揚げ、海老天の有無でインスタンス作成
func NewUdon(p Portion, aburaage bool, ebiten uint) *Udon {
	return &Udon{
		men:      p,
		aburaage: aburaage,
		ebiten:   ebiten,
	}
}

// 海老天2本入りの大盛り
var tempuraUdon = NewUdon(Large, false, 2)

1.6.1 別名の関数によるオプション引数 ...