Приветствую, гоферы! Хочу поделиться с вами шаблонами, которые я часто использую в своих проектах. Они помогают мне писать более структурированный, поддерживаемый и читабельный код.
1. Функциональные возможности (Functional Options)
Этот шаблон позволяет удобно настраивать параметры структуры или функции с помощью опциональных аргументов. Особенно полезно при создании конструкций с большим количеством настроек (например соединение с БД, брокером и т.д.)
Пример:
// Непубличная конфигурируемая структура опций.
type connectionOptions struct {
maxPoolSize int
readTimeout time.Duration
// ...
}
// Опции как функции
//
// Из-за того, что connectionOptions - не экспортируемая структура, потребители не смогут реализовать данный тип.
type Option func(*connectionOptions)
// Реализация функциональных возможностей
func WithMaxPoolSize(s int) Option {
return func(o *connectionOptions) {
o.maxPoolSize = s
}
}
// Реализация функциональных возможностей
func WithReadTimeout(d time.Duration) Option {
return func(o *connectionOptions) {
o.readTimeout = d
}
}
// Функция инициализации
func NewConnection(address string, opts ...Option) *Connection {
cfg := &connectionOptions {
readTimeout: 60 * time.Second, // значения по-умолчанию
maxPoolSize: 10, // значения по-умолчанию
}
// Тут изящно применяются все наши опции
for _, opt := range opts {
opt(cfg)
}
return &Connection{
address: address,
config: cfg,
}
}
func main() {
conn := NewConnection("127.0.0.1:5432",
WithMaxPoolSize(20),
WithReadTimeout(5*time.Second),
)
// ...
}