tgoop.com/go_interview_lib/900
Create:
Last Update:
Last Update:
У нас есть структура ServerConfig. Она хранит все настройки сервера: хост, порт, флаг использования TLS и таймаут.
В функции NewServer мы принимаем срез функций типа Option, который позволяет нам гибко настраивать сервер.
Каждая опция — это просто функция. Причём она не меняет сервер напрямую, а принимает на вход его конфигурацию и меняет только нужное поле.
import "fmt"
// Конфигурация структуры
type ServerConfig struct {
Host string
Port int
UseTLS bool
Timeout int
}
// Тип функции, которая изменяет настройки конфигурации
type Option func(*ServerConfig)
// Новый сервер с конфигурацией по умолчанию
func NewServer(options ...Option) *ServerConfig {
// Настройки по умолчанию
config := &ServerConfig{
Host: "localhost",
Port: 8080,
UseTLS: false,
Timeout: 30,
}
// Применение всех переданных опций
for _, option := range options {
option(config)
}
return config
}
// Опция для изменения хоста
func WithHost(host string) Option {
return func(c *ServerConfig) {
c.Host = host
}
}
// Опция для изменения порта
func WithPort(port int) Option {
return func(c *ServerConfig) {
c.Port = port
}
}
// Опция для включения TLS
func WithTLS(enable bool) Option {
return func(c *ServerConfig) {
c.UseTLS = enable
}
}
// Опция для изменения таймаута
func WithTimeout(timeout int) Option {
return func(c *ServerConfig) {
c.Timeout = timeout
}
}
func main() {
// Создаем сервер с настройками по умолчанию
server := NewServer()
// Печатаем настройки сервера
fmt.Printf("Default server config: %+v\n", server)
// Создаем сервер с измененными настройками
customServer := NewServer(
WithHost("example.com"),
WithPort(9090),
WithTLS(true),
WithTimeout(60),
)
// Печатаем новые настройки сервера
fmt.Printf("Custom server config: %+v\n", customServer)
}