К основному содержанию
скилл CX Codex

go-functional-options — скилл для Claude Code: паттерн опций в Go

Скилл подсказывает, как собрать конструктор в Go с необязательными настройками через функциональные опции. Пригодится, когда у New* уже три и больше необязательных параметров.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add cxuu/golang-skills --skill go-functional-options -a claude-code
Открыть на GitHub

Что делает 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-code

2Вручную: положить файлы

~/.claude/skills/go-functional-options/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/go-functional-options/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Из того же набора19

go-concurrency Правила для горутин, каналов и мьютексов, чтобы агент не плодил утечки и гонки данных в Go-коде. CX Codex +1 1 300установок go-error-handling Скилл учит агента писать надёжную обработку ошибок в Go: выбирать между %w и %v, задавать sentinel-ошибки и не смешивать логирование с возвратом. CX Codex +1 1 300установок go-testing Скилл для написания и разбора тестов на Go: table-driven тесты, сабтесты, хелперы и сравнение через cmp.Diff. Пригодится, когда агент пишет тест к функции. CX Codex +1 1 300установок go-control-flow Скилл учит агента писать канонические циклы, ветвления и switch в Go. Пригодится при оформлении guard clauses и предотвращении багов с затенением переменных. CX Codex +1 1 200установок go-data-structures Скилл для ИИ-агента, который подсказывает идиомы Go при работе со срезами, картами и массивами: make против new, append, nil-срезы и JSON. CX Codex +1 1 200установок go-packages Задаёт правила разбиения Go-кода на пакеты, структурирует импорты и запрещает пакеты util. Пригодится на старте проекта или при рефакторинге растущей кодовой базы. CX Codex +1 1 200установок go-defensive Скилл для ИИ-агента, который проверяет Go-код на границах API: копирование срезов и карт, defer, криптослучайность. CX Codex +1 1 200установок go-naming Скилл следит за именами в Go: пакеты, типы, функции, константы, получатели. Пригодится, когда агент создаёт новые типы или экспортируемое API. CX Codex +1 1 200установок

Похожие

microsoft-extensions-configuration Aaronontheweb Скилл для Claude и других ИИ-редакторов: подсказывает, как привязывать конфигурацию из appsettings.json к типизированным классам и проверять её на старте приложения. CX Codex +1 577установок dart-use-primary-constructors flutter Скилл учит агента переводить классы Dart на первичные конструкторы и синтаксис Dart 3.13+. Он пригодится при рефакторинге моделей данных и сокращении шаблонного кода. CX Codex +1 14 200установок 142-java-functional-programming Juan Antonio Breña Moral Скилл для ИИ-агента, который переписывает Java-код в функциональном стиле: Records, чистые функции, Stream API и Optional. CX Codex +1 376установок vue-options-api-best-practices github.com/vuejs-ai Помогает писать компоненты Vue 3 в стиле Options API и разбирать типичные ошибки с TypeScript, методами и хуками жизненного цикла. CX Codex +1 11 600установок golang-design-patterns samber Скилл подсказывает идиоматичные Go-паттерны для API, жизненного цикла ресурсов, graceful shutdown и архитектуры. Пригодится при проектировании и ревью кода. CX Codex +1 42 100установок golang-performance samber Помогает находить и устранять узкие места в Go-коде: сокращает аллокации памяти, оптимизирует горячие циклы и проверяет результаты замеров. CX Codex +1 41 900установок

Рядом в теме «Языки программирования»

Все скиллы по теме «Языки программирования» →

Вопросы о 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

Смотрите также

Спонсоры проекта

Компании, которые помогают держать аналитику открытой