go-functional-options

Use when designing a Go constructor or factory function with optional configuration — especially with 3+ optional parameters or extensible APIs. Also use when building a New* function that takes many settings, even if they don't mention "functional options" by name. Does not cover general function d

By cxuu · 1,060 installs

npx skills add cxuu/golang-skills --skill go-functional-options

Source repository · Upstream listing

Functional Options Pattern Functional options is a pattern where you declare an opaque Option type that records information in an internal struct. The constructor accepts a variadic number of these options and applies them to configure the result. Resource Routing references/OPTIONS VS STRUCTS.md Read when choosing between config structs and functional options, implementing the full interface based option pattern, or evaluating hybrid constructor APIs. When to Use Use functional options when: 3+ optional arguments on constructors or public APIs Extensible APIs that may gain new options over time Clean caller experience is important (no need to pass defaults) The Pattern Core Components 1. Unexported options struct holds all configuration 2. Exported Option interface with unexported apply method 3. Option types implement the interface 4. With constructors create options Option Interface The unexported apply method ensures only options from this package can be used. Comparison: Functional Options vs Config Struct Aspect Functional Options Config Struct Extensibility Add new With functions Add new fields (may break) Defaults Built into constructor Zero values or separate defaults Caller experience Only specify what differs Must construct entire struct Testability Options are comparable Struct comparison Complexity More boilerplate Simpler setup Prefer Config Struct when : Fewer than 3 options, options rarely change, all options usually specified together, or internal APIs only. Why Not Closures? The interface approach is preferred over closure only options because: 1. Testability Options can be compared in tests and mocks 2. Debuggability Options can implement fmt.Stringer 3. Flexibility Options can implement additional interfaces 4. Visibility Option types are visible in documentation Quick Reference Checklist [ ] options struct is unexported [ ] Option interface has unexported apply method [ ] Each option has a With constructor [ ] Defaults are set before applying options [ ] Required parameters are separate from ...Option Related Skills Interface design : See [go interfaces](../go interfaces/SKILL.md) when designing the Option interface or choosing between interface and closure approaches Naming conventions : See [go naming](../go naming/SKILL.md) when naming With constructors, option types, or the unexported options struct Function design : See [go functions](../go functions/SKILL.md) when organizing constructors within a file or formatting variadic signatures Documentation : See [go documentation](../go documentation/SKILL.md) when documenting Option types, With functions, or constructor behavior External Resources [Self referential functions and the design of options](https://commandcenter.blogspot.com/2014/01/self referential functions and design.html) Rob Pike [Functional options for friendly APIs](https://dave.cheney.net/2014/10/17/functional options for friendly apis) Dave Cheney