Use when idiomatic Go patterns, best practices, and conventions for building robust, efficient, and maintainable Go applications. Only for Go — not for other languages. Triggers on \"golang-patterns\", \"golang patterns\", \"patterns\".
Installs into .claude/skills of the current project.
Are you the author of Golang Patterns?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/majinmagros-golang-patterns)
---
name: golang-patterns
description: "Use when idiomatic Go patterns, best practices, and conventions for building robust, efficient, and maintainable Go applications. Only for Go — not for other languages. Triggers on \"golang-patterns\", \"golang patterns\", \"patterns\"."
metadata:
origin: ECC
---
# Go Development Patterns
Idiomatic Go patterns and best practices for building robust, efficient, and maintainable applications.
## When to Activate
- Writing new Go code
- Reviewing Go code
- Refactoring existing Go code
- Designing Go packages/modules
## When NOT to Use
- Other languages (use `python-patterns`, `rust-patterns`, `kotlin-patterns`, etc.)
- Go test strategy specifically (use `golang-testing`)
## Contents
| Topic | Reference |
|---|---|
| Core principles (simplicity, zero value, interfaces) | `references/core-principles.md` |
| Error handling (wrapping, custom types, Is/As) | `references/error-handling.md` |
| Concurrency (worker pool, context, errgroup) | `references/concurrency.md` |
| Interface design | `references/interfaces.md` |
| Package organization | `references/packages.md` |
| Struct design (options, embedding) | `references/structs.md` |
| Memory and performance | `references/performance.md` |
| Tooling (commands, golangci) | `references/tooling.md` |
## Quick Reference: Go Idioms
| Idiom | Description |
|-------|-------------|
| Accept interfaces, return structs | Functions accept interface params, return concrete types |
| Errors are values | Treat errors as first-class values, not exceptions |
| Don't communicate by sharing memory | Use channels for coordination between goroutines |
| Make the zero value useful | Types should work without explicit initialization |
| A little copying is better than a little dependency | Avoid unnecessary external dependencies |
| Clear is better than clever | Prioritize readability over cleverness |
| gofmt is no one's favorite but everyone's friend | Always format with gofmt/goimports |
| Return early | Handle errors first, keep happy path unindented |
## Anti-Patterns to Avoid
```go
// Bad: Naked returns in long functions
func process() (result int, err error) {
// ... 50 lines ...
return // What is being returned?
}
// Bad: Using panic for control flow
func GetUser(id string) *User {
user, err := db.Find(id)
if err != nil {
panic(err) // Don't do this
}
return user