go-functional-options — скилл для Claude Code: паттерн опций в Go
Скилл подсказывает, как собрать конструктор в Go с необязательными настройками через функциональные опции. Пригодится, когда у New* уже три и больше необязательных параметров.
npx skills add cxuu/golang-skills --skill go-functional-options -a claude-codeЧто делает go-functional-options
Скилл описывает паттерн функциональных опций: непрозрачный тип Option записывает настройки во внутреннюю структуру, а конструктор принимает их вариативно и применяет поверх значений по умолчанию. Внутри — разбор компонентов паттерна, сравнение с конфигурационной структурой и чек-лист.
Ключевая деталь — неэкспортируемый метод apply в интерфейсе Option. Из-за него опции из чужого пакета использовать нельзя, и это осознанное ограничение, а не недоработка. Автор отдельно объясняет, почему интерфейс предпочтительнее замыканий: опции сравнимы в тестах, могут реализовать fmt.Stringer и видны в документации.
В скилле есть таблица, по которой видно, когда брать конфигурационную структуру: меньше трёх опций, настройки меняются редко или задаются все сразу. Если у вас именно такой случай, паттерн добавит лишний код. Отдельный файл references/OPTIONS-VS-STRUCTS.md разбирает гибридные API и полную реализацию на интерфейсах.
Какие задачи решает
- спроектировать конструктор
New*с тремя и более необязательными параметрами - добавить новую настройку в публичный API, не ломая существующих вызовов
- убрать из вызовов передачу значений по умолчанию
- сравнивать опции в тестах и моках
- выбрать между функциональными опциями и конфигурационной структурой
Примеры запросов агенту
- Спроектируй конструктор
NewServerс функциональными опциями для таймаутов и логгера - У меня в
NewClientуже пять необязательных параметров — перепиши на паттерн опций - Помоги выбрать между config struct и функциональными опциями для этого API
Как установить go-functional-options
1Через Skills CLI (Vercel)
npx skills add cxuu/golang-skills --skill go-functional-options -a claude-code2Вручную: положить файлы
~/.claude/skills/go-functional-options/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/go-functional-options/
1Через Skills CLI (Vercel)
npx skills add cxuu/golang-skills --skill go-functional-options -a codex2Вручную: положить файлы
.agents/skills/go-functional-options/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add cxuu/golang-skills --skill go-functional-options -a cursor2Вручную: положить файлы
.cursor/skills/go-functional-options/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install cxuu/golang-skills go-functional-options2Вручную: положить файлы
.github/skills/go-functional-options/SKILL.md1Через Skills CLI (Vercel)
npx skills add cxuu/golang-skills --skill go-functional-options -a gemini-cli2Командой платформы
gemini skills install https://github.com/cxuu/golang-skills --path skills/go-functional-optionsВручную: положить файлы
.devin/skills/go-functional-options/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add cxuu/golang-skills --skill go-functional-options -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Из того же набора19
Похожие
Рядом в теме «Языки программирования»
Все скиллы по теме «Языки программирования» →Вопросы о go-functional-options
Как установить go-functional-options в Claude?
Выполните npx skills add cxuu/golang-skills --skill go-functional-options -a claude-code. Скилл окажется в ~/.claude/skills/go-functional-options/SKILL.md.
Что делает go-functional-options?
Помогает проектировать конструкторы и фабрики в Go с необязательной конфигурацией: структура options, интерфейс Option с методом apply, конструкторы With*.
Чем функциональные опции отличаются от конфигурационной структуры?
Опции расширяются добавлением новых функций With* и не требуют передавать значения по умолчанию. Структура проще в настройке, но добавление поля может сломать вызовы, поэтому для трёх и более опций скилл советует первый вариант.
Исходный текст
SKILL.md · Apache-2.0
---
name: go-functional-options
description: 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 design (see go-functions).
---
# 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
```go
type Option interface {
apply(*options)
}
```
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
```go
// 1. Unexported options struct with defaults
type options struct {
field1 Type1
field2 Type2
}
// 2. Exported Option interface, unexported method
type Option interface {
apply(*options)
}
// 3. Option type + apply + With* constructor
type field1Option Type1
func (o field1Option) apply(opts *options) { opts.field1 = Type1(o) }
func WithField1(v Type1) Option { return field1Option(v) }
// 4. Constructor applies options over defaults
func New(required string, opts ...Option) (*Thing, error) {
o := options{field1: defaultField1, field2: defaultField2}
for _, opt := range opts {
opt.apply(&o)
}
// ...
}
```
### 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
© cxuu · Apache-2.0 · cxuu/golang-skills