После некоторого времени изучения проектов с открытым исходным кодом я часто вижу шаблон в параметрах настройки для класса. (Пусть, скажем, «неизменяемый метод»)
// list of possible options
type Options struct {
Sampler sampler
SpanKind int
}
// define an apply function. which will be called when really initialize an object
type Option func(*Options)
// for each option. Return an function to apply that specific option
func WithSpanKind(spanKind int) Option {
return func(o *Options) {
o.SpanKind = spanKind
}
}
// then. we we build a new object, we just need to receive a list of option
func NewObject(options ...Option) Object {
final := &Options{}
// then apply each option to options
for _, option := range options {
option(final)
}
// then build an object based on the final object
}
По сравнению с вышеописанным методом, есть еще один способ использования простого метода получения / установки.
func (o *Options) SetSpanKind(kind int) {
o.spanKind = kind
}
// then. we we build a new object by using directly the Options object
func NewObject(option Options) Object {
}
Мой вопрос: каковы различия между этими подходами и почему первый подход всегда предпочитается во многих открытых источниках, которые я прочитал.
Отмечено: Вот некоторые открытые источники с линией, которая реализует вышеупомянутый образец. Эти открытые источники инициированы Google, поэтому, возможно, этот шаблон указывает только c только на Google.
Спасибо