Go 文化なのかわからないけど New とか構造体作れる関数や初期化する関数へのオプションを設定するためのコールバック関数を設定するキメ文句をよく見るような気がする。
func WithInsecure() func(*Config) {
return func(cfg *Config) {
cfg.insecure = true
}
}
func WithUserAgent(ua String) func(*Config) {
return func(cfg *Config) {
cfg.userAgent = ua
}
}
func main() {
req := NewRequest(
WithInsecure(),
WithUserAgent(),
)
req.Send()
}
こういう感じのやつ。
オプションを外のパッケージに対して隠せるっていうメリットがあるのかな。 流れに乗っておくと、雰囲気で利用できて便利そうだなーって思った。
追記:2019年3月4日 これは Functional Option Pattern だ、という話をまったく違う流れで社の Slack で知った。
Config 構造体でがんばって持つのもいいけど、文量増えてきたり、外に公開するような API であった場合にちょっと不便かなあと思っていたので、このデザインはいいなと思った。