options pattern example

This commit is contained in:
“Smyshlyaev.IO” 2025-08-26 16:52:43 +03:00
parent 75d2d36f64
commit 1e35489e60
2 changed files with 76 additions and 0 deletions

3
options-pattern/go.mod Normal file
View File

@ -0,0 +1,3 @@
module optpat
go 1.24.2

73
options-pattern/main.go Normal file
View File

@ -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)
}