diff --git a/options-pattern/go.mod b/options-pattern/go.mod new file mode 100644 index 0000000..fbfe29b --- /dev/null +++ b/options-pattern/go.mod @@ -0,0 +1,3 @@ +module optpat + +go 1.24.2 diff --git a/options-pattern/main.go b/options-pattern/main.go new file mode 100644 index 0000000..de6babf --- /dev/null +++ b/options-pattern/main.go @@ -0,0 +1,73 @@ +package main + +import ( + "fmt" + "strings" + "time" +) + +type AbstractConfig struct { + timeout time.Duration + port int32 + logLevel string +} + +type Options func(*AbstractConfig) + +// NewConfig создаёт новый экземпляр AbstractConfig, может принимать опции или возвращает значения по умолчанию. +func NewConfig(options ...Options) *AbstractConfig { + config := &AbstractConfig{ + timeout: time.Second * 5, + port: 8080, + logLevel: "info", + } + + for _, option := range options { + option(config) + } + + return config +} + +// String метод для преобразования AbstractConfig в строку для форматированного вывода. Имплементирует интерфейс Stringer +func (cfg *AbstractConfig) String() string { + var output strings.Builder + output.WriteString(fmt.Sprintf("%-20s%s\n", "timeout", cfg.timeout)) + output.WriteString(fmt.Sprintf("%-20s%d\n", "port", cfg.port)) + output.WriteString(fmt.Sprintf("%-20s%s\n", "log level", cfg.logLevel)) + return output.String() +} + +// WithTimeout устанавливает значение timeout в AbstractConfig +func WithTimeout(timeout time.Duration) Options { + return func(config *AbstractConfig) { + config.timeout = timeout + } +} + +// WithPort устанавливает значение port в AbstractConfig +func WithPort(port int32) Options { + return func(config *AbstractConfig) { + config.port = port + } +} + +// WithLogLevel устанавливает значение logLevel в AbstractConfig +func WithLogLevel(logLevel string) Options { + return func(config *AbstractConfig) { + config.logLevel = logLevel + } +} + +func main() { + fmt.Println("Default config") + defCfg := NewConfig() + fmt.Println(defCfg) + + fmt.Println("Custom config") + customCfg := NewConfig( + WithLogLevel("debug"), + WithTimeout(10*time.Second), + ) + fmt.Println(customCfg) +}