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

go-interfaces — скилл для Claude Code: что делает и как установить

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

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

Что делает go-interfaces

Скилл задаёт правила идиоматичного Go: интерфейс объявляется на стороне потребителя, а конструкторы возвращают конкретные структуры. Исключение сделано только для сокрытия реализации. Если тип существует исключительно ради интерфейса, конструктор возвращает интерфейс. Внутри описаны безопасное приведение типов через comma-ok, работа с type switch и выбор между указательными и структурными ресиверами.

Для защиты публичного API скилл запрещает встраивать внутренние типы в экспортируемые структуры, чтобы не раздувать набор методов. Проверять реализацию контрактов он предписывает на этапе сборки через выражение var _ I = (*T)(nil). В репозиторий входят скрипт scripts/check-interface-compliance.sh и вспомогательный код scripts/check-interface-compliance.go, находящие типы без таких проверок через Bash.

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

Какие задачи решает

  • спроектировать границы пакетов в Go без преждевременного объявления интерфейсов
  • настроить проверку реализации интерфейса во время компиляции через var _ I = (*T)(nil)
  • защитить публичный API от случайного раскрытия методов при встраивании структур
  • реализовать безопасное приведение типов через конструкцию comma-ok

Примеры запросов агенту

  • Спроектируй consumer-интерфейс для нового сервиса отправки уведомлений на Go
  • Проверь типы ресиверов и контракты в этом пакете через check-interface-compliance.sh
  • Перепиши type switch с безопасным приведением типов для обработки событий

Как установить go-interfaces

1Через Skills CLI (Vercel)

npx skills add cxuu/golang-skills --skill go-interfaces -a claude-code

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

~/.claude/skills/go-interfaces/SKILL.md

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

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

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

go-naming Скилл следит за именами в Go: пакеты, типы, функции, константы, получатели. Пригодится, когда агент создаёт новые типы или экспортируемое API. CX Codex +1 1 200установок go-context Задаёт правила работы с context.Context в Go: от сигнатур функций и таймаутов до разделения данных запроса и параметров. CX Codex +1 1 200установок go-style-core Скилл задаёт базовые правила оформления Go-кода: отступы, вложенность, naked returns, точки с запятой. Пригодится, когда агент пишет или правит код на Go. CX Codex +1 1 200установок go-performance Скилл для оптимизации Go: подсказывает, где заменить fmt на strconv, как задать ёмкость слайса и когда хватит strings.Builder. CX Codex +1 1 200установок go-declarations Скилл для ИИ-агента, который подсказывает, как объявлять переменные, константы, структуры и мапы в Go. Пригодится, когда пишете новый struct или блок const. CX Codex +1 1 000установок go-generics Скилл подсказывает, когда в Go стоит брать дженерики, а когда хватит конкретных типов или интерфейса. Полезен, если пишете утилиту под несколько типов. CX Codex +1 1 000установок go-functions Скилл задаёт правила порядка функций в файле Go, оформления сигнатур и форматирования строк. Пригодится при написании или рефакторинге методов. CX Codex +1 1 000установок go-logging Скилл для ИИ-агента, который подсказывает, как писать логи в Go: уровни, структурные поля, контекст запроса. Пригодится, когда проект на Go обрастает логами и надо навести порядок. CX Codex +1 1 000установок

Похожие

golang-structs-interfaces samber Скилл задаёт правила проектирования структур и интерфейсов в Go. Помогает собирать типы, проверять реализации при компиляции и избегать лишних абстракций. CX Codex +1 39 800установок golang-patterns affaan-m Скилл подсказывает идиоматичные паттерны Go при написании, ревью и рефакторинге кода. Пригодится, когда нужно проверить структуру пакета или обработку ошибок. CX Codex +1 5 200установок typescript gentleman-programming Скилл задаёт агенту правила строгого TypeScript: const-объекты вместо union-типов, плоские интерфейсы, отказ от any. Пригодится, когда код пишет ИИ и хочется единый стиль. CX Codex +1 496установок Agentic UX Design - Relationship-Centric Interfaces bencium Направляет проектирование ИИ-интерфейсов вокруг памяти, динамики доверия и совместных планов, а не разовых экранов. Помогает, когда сервису нужно помнить контекст между сессиями. CX Codex +1 3 300установок refactor-plan официальный github Скилл изучает кодовую базу и готовит пошаговый план многофайлового рефакторинга до правок. Подходит, когда изменения нужно согласовать заранее. 12 965установок golang-refactoring samber Скилл для структурного переобустройства Go-кода с гарантией сохранения поведения. Использует gopls, gofmt и инструменты вроде gopatch, чтобы разбить большие функции, переименовать типы в масштабе проекта и перестроить пакеты без ошибок. CX Codex +1 11 300установок

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

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

Вопросы о go-interfaces

Как установить go-interfaces в Claude Code?

Выполните команду npx skills add cxuu/golang-skills --skill go-interfaces -a claude-code. Агент добавит скилл в рабочее окружение.

Что делает скилл go-interfaces?

Он помогает агенту проектировать Go-интерфейсы по правилу «принимай интерфейсы, возвращай структуры», избегать утечек методов через встраивание и безопасно приводить типы.

Подходит ли этот скилл для настройки дженериков в Go?

Нет, полиморфизм на базе дженериков сюда не входит. Для параметризованных типов автор скилла предусмотрел отдельное руководство go-generics.

Исходный текст

SKILL.md · Apache-2.0
---
name: go-interfaces
description: Use when defining or implementing Go interfaces, designing abstractions, creating mockable boundaries for testing, or composing types through embedding. Also use when deciding whether to accept an interface or return a concrete type, or using type assertions or type switches, even if the user doesn't explicitly mention interfaces. Does not cover generics-based polymorphism (see go-generics).
allowed-tools: Bash(bash:*)
---

# Go Interfaces and Composition

## Resource Routing

- `scripts/check-interface-compliance.sh` - Run as a heuristic to find exported interfaces that may need compile-time assertions.
- `scripts/check-interface-compliance.go` - Implementation helper invoked by `check-interface-compliance.sh`; patch this when changing method-set analysis.
- `references/EMBEDDING.md` - Read when embedding interfaces or structs in public APIs.
- `references/RECEIVER-TYPE.md` - Read when pointer/value receivers affect interface satisfaction.

---

## Accept Interfaces, Return Concrete Types

Interfaces belong in the package that **consumes** values, not the package that
**implements** them. Return concrete (usually pointer or struct) types from
constructors so new methods can be added without refactoring.

```go
// Good: consumer defines the interface it needs
package consumer

type Thinger interface { Thing() bool }

func Foo(t Thinger) string { ... }
```

```go
// Good: producer returns concrete type
package producer

type Thinger struct{ ... }
func (t Thinger) Thing() bool { ... }
func NewThinger() Thinger { return Thinger{ ... } }
```

```go
// Bad: producer defines and returns its own interface
package producer

type Thinger interface { Thing() bool }
type defaultThinger struct{ ... }
func NewThinger() Thinger { return defaultThinger{ ... } }
```

**Do not define interfaces before they are used.** Without a realistic example
of usage, it is too difficult to see whether an interface is even necessary.

---

## Generality: Hide Implementation, Expose Interface

If a type exists only to implement an interface with no exported methods beyond
that interface, return the interface from constructors to hide the implementation:

```go
func NewHash() hash.Hash32 {
    return &myHash{}  // unexported type
}
```

Benefits: implementation can change without affecting callers, substituting
algorithms requires only changing the constructor call.

---

## Type Assertions: Comma-Ok Idiom

Without checking, a failed assertion causes a runtime panic. Always use the
comma-ok idiom to test safely:

```go
str, ok := value.(string)
if ok {
    fmt.Printf("string value is: %q\n", str)
}
```

To check if a value implements an interface:

```go
if _, ok := val.(json.Marshaler); ok {
    fmt.Printf("value %v implements json.Marshaler\n", val)
}
```

---

## Type Switch

It's idiomatic to reuse the variable name (`t := t.(type)`) — the variable has
the correct type in each case branch. When a case lists multiple types
(`case int, int64:`), the variable has the interface type.

---

## Embedding

Avoid embedding types in public structs — the inner type's full method set
becomes part of your public API. Use unexported fields instead.

---

## Interface Satisfaction Checks

Use a blank identifier assignment to verify a type implements an interface at
compile time:

```go
var _ json.Marshaler = (*RawMessage)(nil)
```

This causes a compile error if `*RawMessage` doesn't implement `json.Marshaler`.

Use this pattern when:
- There are no static conversions that would verify the interface automatically
- The type must satisfy an interface for correct behavior (e.g., custom JSON
  marshaling)
- Interface changes should break compilation, not silently degrade

**Don't** add these checks for every interface — only when no other static
conversion would catch the error.

> **Validation**: After defining interfaces or implementations, run `bash scripts/check-interface-compliance.sh` to verify all concrete types have compile-time `var _ I = (*T)(nil)` checks.

---

## Receiver Type

If in doubt, use a pointer receiver. Don't mix receiver types on a single
type — if any method needs a pointer, use pointers for all methods. Use value
receivers only for small, immutable types (`Point`, `time.Time`) or basic types.

---

## Quick Reference

| Concept | Pattern | Notes |
|---------|---------|-------|
| Consumer owns interface | Define interfaces where used | Not in the implementing package |
| Safe type assertion | `v, ok := x.(Type)` | Returns zero value + false |
| Type switch | `switch v := x.(type)` | Variable has correct type per case |
| Interface embedding | `type RW interface { Reader; Writer }` | Union of methods |
| Struct embedding | `type S struct { *T }` | Promotes T's methods |
| Interface check | `var _ I = (*T)(nil)` | Compile-time verification |
| Generality | Return interface from constructor | Hide implementation |

---

## Related Skills

- **Interface naming**: See [go-naming](../go-naming/SKILL.md) when naming interfaces (the `-er` suffix convention) or choosing receiver names
- **Error types**: See [go-error-handling](../go-error-handling/SKILL.md) when implementing the `error` interface, custom error types, or `errors.As` matching
- **Generics vs interfaces**: See [go-generics](../go-generics/SKILL.md) when deciding whether generics are needed or an interface already suffices
- **Functional options**: See [go-functional-options](../go-functional-options/SKILL.md) when using an interface-based Option pattern for flexible constructors
- **Defensive boundaries**: See [go-defensive](../go-defensive/SKILL.md) when interface assertions are one part of a broader API-boundary hardening pass

© cxuu · Apache-2.0 · cxuu/golang-skills

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

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

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