Опциональные параметры через функции: Option - тип func(*Config) или интерфейс; конструктор принимает ...Option и применяет их к конфигу. Удобно для большого числа опций и значений по умолчанию. В стандартной библиотеке: grpc.Dial(addr, grpc.WithInsecure(), grpc.WithBlock()).
type Option func(*Server)
func WithPort(p int) Option { return func(s *Server) { s.port = p } }
func NewServer(opts ...Option) *Server {
s := &Server{port: 8080}
for _, o := range opts { o(s) }
return s
}