Нужен конструктор HTTP-клиента: адрес обязателен, остальное необязательно и
имеет значения по умолчанию. Через год у клиента появятся новые настройки, и
сигнатура New при этом меняться не должна. Сделай это через функциональные
опции WithX(...).
type Client struct {
Addr string
Timeout time.Duration
Retries int
Headers map[string]string
}
type Option func(*Client)
func New(addr string, opts ...Option) *Client
func WithTimeout(d time.Duration) Option
func WithRetries(n int) Option
func WithHeader(key, value string) Option
Требования
- Значения по умолчанию:
Timeout = 5 с, Retries = 3, Headers — пустая,
но не nil map.
- Опции применяются по порядку, при повторе выигрывает последняя
(
WithRetries(1), WithRetries(7) → 7).
WithHeader накапливается: каждый вызов добавляет заголовок, повтор ключа
перезаписывает значение.
nil среди опций пропускается без паники.
- Клиенты независимы: заголовок, добавленный в одного, не появляется у другого,
даже если их создали с одним и тем же срезом опций.
New без опций — валидный клиент со значениями по умолчанию.
Пример
c := New("api.local:443",
WithTimeout(time.Second),
WithHeader("X-Request-Source", "billing"),
)
// c.Timeout == 1s, c.Retries == 3, c.Headers == {"X-Request-Source": "billing"}
Устно: чем опции лучше структуры Config в аргументах и чем хуже? Как
добавить валидацию (например, отрицательный Retries)?
Разбор и эталонное решение — после своей попытки: на собеседовании подсказок не будет.
Сначала попробуй сам — подсказки не дают готовый ответ.