Golang Idioms
Idiomatic Go patterns for error handling, interfaces, concurrency, testing, and module...
Install
npx skills add rohitg00/awesome-claude-code-toolkit --skill golang-idioms -g -a claude-code -y- Repository
- rohitg00/awesome-claude-code-toolkit2.8k
- Category
- Testing
- Updated
- 6mo ago
- License
- Apache-2.0
- Context cost
- Mediumabout 1,910 tokens
- Runs scripts
- No, instructions only
What it does
Idiomatic Go patterns for error handling, interfaces, concurrency, testing, and module management
Go Idioms
Error Handling
// Return errors, never panic in library code
func LoadConfig(path string) (Config, error) {
data, err := os.ReadFile(path)
if err != nil {
return Config{}, fmt.Errorf("reading config %s: %w", path, err)
}
var cfg Config
if err := json.Unmarshal(data, &cfg); err != nil {
return Config{}, fmt.Errorf("parsing config: %w", err)
}
return cfg, nil
}
Rules:
- Always wrap errors with context using
fmt.Errorf("context: %w", err) - Use
%wto allow callers to useerrors.Isanderrors.As - Handle errors at the appropriate level; do not log and return the same error
- Define sentinel errors for expected conditions
var (
ErrNotFound = errors.New("not found")
ErrUnauthorized = errors.New("unauthorized")
)
func GetUser(id string) (User, error) {
user, ok := store[id]
if !ok {
return User{}, fmt.Errorf("user %s: %w", id, ErrNotFound)
}
return user, nil
}
// Caller
user, err := GetUser(id)
if errors.Is(err, ErrNotFound) {
http.Error(w, "user not found", http.StatusNotFound)
return
}
Interface Design
// Keep interfaces small (1-3 methods)
type Reader interface {
Read(p []byte) (n int, err error)
}
type UserStore interface {
GetUser(ctx context.Context, id string) (User, error)
CreateUser(ctx context.Context, u User) error
}
// Accept interfaces, return structs
func NewService(store UserStore, logger *slog.Logger) *Service {
return &Service{store: store, logger: logger}
}
Rules:
- Define interfaces where they are used (consumer side), not where they are implemented
- Prefer small, composable interfaces over large ones
- Use
io.Reader,io.Writer,fmt.Stringerfrom the standard library - An interface with one method should be named after the method +
ersuffix


