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)
}
Create a free account and build your private vault. Share publicly whenever you want.