// Created on savesnippets.com ยท https://savesnippets.com/h6yvFMelHNjuvU package main import ( "fmt" "time" ) type Server struct { addr string timeout time.Duration tls bool logger func(string) } type Option func(*Server) func WithTimeout(d time.Duration) Option { return func(s *Server) { s.timeout = d } } func WithTLS() Option { return func(s *Server) { s.tls = true } } func WithLogger(fn func(string)) Option { return func(s *Server) { s.logger = fn } } func NewServer(addr string, opts ...Option) *Server { s := &Server{ addr: addr, timeout: 30 * time.Second, // defaults logger: func(string) {}, // no-op } for _, opt := range opts { opt(s) } return s } func main() { srv := NewServer(":8080", WithTimeout(5*time.Second), WithTLS(), WithLogger(func(msg string) { fmt.Println("LOG:", msg) }), ) fmt.Printf("%+v\n", srv) }