Шаблон функциональных параметров — это шаблон проектирования, который позволяет создавать настраиваемую структуру путем определения конструктора с переменным числом аргументов, который принимает функциональные параметры в качестве аргументов. Эти функциональные параметры изменяют поведение или свойства структуры, делая ее более гибкой и простой в использовании.
Например, если вы посещаете пиццерию и хотите, чтобы пицца соответствовала вашим предпочтениям, вы можете запросить определенные начинки, такие как дополнительный сыр, панир или перец, или запросить изменения в способе приготовления, толщине корочки или типе соуса. По сути, вы предоставите магазину пиццы набор настраиваемых опций, чтобы сделать вашу пиццу уникальной и по вашему вкусу.
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) }