Шаблон функциональных параметров — это шаблон проектирования, который позволяет создавать настраиваемую структуру путем определения конструктора с переменным числом аргументов, который принимает функциональные параметры в качестве аргументов. Эти функциональные параметры изменяют поведение или свойства структуры, делая ее более гибкой и простой в использовании.

Например, если вы посещаете пиццерию и хотите, чтобы пицца соответствовала вашим предпочтениям, вы можете запросить определенные начинки, такие как дополнительный сыр, панир или перец, или запросить изменения в способе приготовления, толщине корочки или типе соуса. По сути, вы предоставите магазину пиццы набор настраиваемых опций, чтобы сделать вашу пиццу уникальной и по вашему вкусу.

type Pizza struct {
 pepper         bool
 salt           bool
 cheese         bool
 extraCheese    bool
 chickenTopping bool
 paneerTopping  bool
// we have lot of things to add here to make it a complex pizza 😋

}

// option type which return a fucntion 
type Options func(config *Pizza)


func BuildPizza(options ...Options) *Pizza {
 // defaults values 
 p := &Pizza{
  salt:   true,
  cheese: true,
 }

 for _, opt := range options {
  if opt!=nil{
    opt(p)
  }
  
 }
 return p

}

func WithPepper() func(config *Pizza) {
 return func(config *Pizza) {
  config.pepper = true
 }
}

func WithSalt() func(config *Pizza) {
 return func(config *Pizza) {
  config.salt = true
 }
}

func WithCheese() func(config *Pizza) {
 return func(config *Pizza) {
  config.cheese = true
 }
}
func WithExtraCheese() func(config *Pizza) {
 return func(config *Pizza) {
  config.pannerTopping = true
 }
}

func WithChickenTopping() func(config *Pizza) {
 return func(config *Pizza) {
  config.chickenTopping = true
 }
}
func WithPaneerTopping() func(config *Pizza) {
 return func(config *Pizza) {
  config.paneerTopping = true
 }
}

Использование:-

// usage 
func main() {

 myPizza := BuildPizza(WithPepper(), WithExtraCheese(), WithChickenTopping())

 fmt.Printf("eating delicious Pizza--> %+v ", myPizza)
}