go-code-review
Use when reviewing Go code or checking code against community style standards. Also use proactively before submitting a Go PR or…
Use when organizing functions within a Go file, formatting function signatures, designing return values, or following Printf-style naming conventions. Also use when a user is adding or refactoring any Go function, even if they don't mention function design or signature
$ npx -y skills add cxuu/golang-skills --skill go-functions --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/go-functionsContext preview
The summary Claude sees to decide when to auto-load this skill.
Use when organizing functions within a Go file, formatting function signatures, designing return values, or following Printf-style naming conventions. Also use when a user is adding or refactoring any Go function, even if they don't mention function design or signature
name: go-functions description: Use when organizing functions within a Go file, formatting function signatures, designing return values, or following Printf-style naming conventions. Also use when a user is adding or refactoring any Go function, even if they don't mention function design or signature formatting. Does not cover functional options constructors (see go-functional-options).
> **When this skill does NOT apply**: For functional options constructors (`WithTimeout`, `WithLogger`), see [go-functional-options](../go-functional-options/SKILL.md). For error return conventions, see [go-error-handling](../go-error-handling/SKILL.md). For naming functions and methods, see [go-naming](../go-naming/SKILL.md).
---
Organize functions in a file by these rules:
1. Functions sorted in **rough call order** 2. Functions **grouped by receiver** 3. **Exported** functions appear first, after `struct`/`const`/`var` definitions 4. `NewXxx`/`newXxx` constructors appear right after the type definition 5. Plain utility functions appear toward the end of the file
type something struct{ ... }
func newSomething() *something { return &something{} }
func (s *something) Cost() int { return calcCost(s.weights) }
func (s *something) Stop() { ... }
func calcCost(n []int) int { ... }---
Keep the signature on a single line when possible. When it must wrap, put **all arguments on their own lines** with a trailing comma:
func (r *SomeType) SomeLongFunctionName(
foo1, foo2, foo3 string,
foo4, foo5, foo6 int,
) {
foo7 := bar(foo1)
}Add `/* name */` comments for ambiguous arguments, or better yet, replace naked `bool` parameters with custom types.
---
You almost never need a pointer to an interface. Pass interfaces as values — the underlying data can still be a pointer.
// Bad: pointer to interface
func process(r *io.Reader) { ... }
// Good: pass the interface value
func process(r io.Reader) { ... }---
Functions that accept a format string should end in `f` for `go vet` support. Declare format strings as `const` when used outside `Printf` calls.
Prefer `%q` over `%s` with manual quoting when formatting strings for logging or error messages — it safely escapes special characters and wraps in quotes:
return fmt.Errorf("unknown key %q", key) // produces: unknown key "foo\nbar"See **go-functional-options** when designing a constructor with 3+ optional parameters.
---
| Topic | Rule | |-------|------| | File ordering | Type -> constructor -> exported -> unexported -> utils | | Signature wrapping | All args on own lines with trailing comma | | Naked parameters | Add `/* name */` comments or use custom types | | Pointers to interfaces | Almost never needed; pass interfaces by value | | Printf function names | End with `f` for `go vet` support |
---
AI Agent Skills for writing idiomatic, production-quality Go code. 20 modular skills teach AI coding assistants Go best practices derived from: Google Go Style Guide Effective Go Uber Go Style Guide Go Wiki CodeReviewComments Skills are tuned following
Use when reviewing Go code or checking code against community style standards. Also use proactively before submitting a Go PR or…
Use when writing concurrent Go code — goroutines, channels, mutexes, or thread-safety guarantees. Also use when parallelizing…
Use when working with context.Context in Go — placement in signatures, propagating cancellation and deadlines, and storing values…
Use when writing conditionals, loops, or switch statements in Go — including if with initialization, early returns, for loop…
Use when working with Go slices, maps, or arrays — choosing between new and make, using append, declaring empty slices (nil vs…
Use when declaring or initializing Go variables, constants, structs, or maps — including var vs :=, reducing scope with if-init,…