options pattern example
This commit is contained in:
parent
75d2d36f64
commit
1e35489e60
|
@ -0,0 +1,3 @@
|
|||
module optpat
|
||||
|
||||
go 1.24.2
|
|
@ -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)
|
||||
}
|
Loading…
Reference in New Issue