| name | golang |
| description | Coding conventions and best practices for writing Go code. Idiomatic Go style, error handling, and testing guide. TRIGGER: .go file work, Go module development, interface design, test writing, error handling patterns |
Go Coding Standards
Basic Principles
One Function, One Responsibility
- If function name connects with "and" or "or", it's a signal to split
- If test cases are needed for each if branch, it's a signal to split
Conditional and Loop Depth Limited to 2 Levels
- Minimize depth using early return whenever possible
- If still heavy, extract into separate functions
Make Function Side Effects Explicit
- Example: If
getUseralso runsupdateLastAccess(), specify it in the function name
Convert Magic Numbers/Strings to Constants When Possible
- Declare at the top of the file where used
- Consider separating into a constants file if there are many
Function Order by Call Order
- Follow Go's clear conventions if they exist
- Otherwise, order top-to-bottom for easy reading by call order
Review External Libraries for Complex Implementations
- When logic is complex and tests become bloated
- If industry-standard libraries exist, use them
- When security, accuracy, or performance optimization is critical
- When platform compatibility or edge cases are numerous
Modularization (Prevent Code Duplication and Pattern Repetition)
- Absolutely forbid code repetition
- Modularize similar patterns into reusable forms
- Allow pre-modularization if reuse is confirmed
- Avoid excessive abstraction
- Modularization levels:
- Same file: Extract into separate function
- Multiple files: Separate into different package
- Multiple projects/domains: Separate into different module
Variable and Function Names
- Clear purpose while being concise
- Forbid abbreviations outside industry standards (id, api, db, err, etc.)
- Don't repeat context from the parent scope
- Boolean variables use
is,has,shouldprefixes - Function names are verbs or verb+noun forms
- Plural rules:
- Pure arrays/slices: "s" suffix (
users) - Wrapped struct: "list" suffix (
userList) - Specific data structure: Explicit (
userSet,userMap) - Already plural words: Use as-is
- Pure arrays/slices: "s" suffix (
Field Order
- Alphabetically ascending by default
- Maintain consistency in usage
Error Handling
- Error handling level: Handle where meaningful response is possible
- Error messages: Technical details for logs, actionable guidance for users
- Error classification: Distinguish between expected and unexpected errors
- Error propagation: Add context when propagating up the call stack
- Recovery vs. fast fail: Recover from expected errors with fallback
- Use %w for error chains, %v for simple logging
- Wrap internal errors not to be exposed with %v
- Never ignore return errors from functions; handle them explicitly
- Sentinel errors: For expected conditions that callers must handle, use
var ErrNotFound = errors.New("not found")
File Structure
Element Order in File
- package declaration
- import statements (grouped)
- Constant definitions (const)
- Variable definitions (var)
- Type/Interface/Struct definitions
- Constructor functions (New*)
- Methods (grouped by receiver type, alphabetically ordered)
- Helper functions (alphabetically ordered)
Interfaces and Structs
Interface Definition Location
- Define interfaces in the package that uses them (Accept interfaces, return structs)
- Only separate shared interfaces used by multiple packages
Pointer Receiver Rules
- Use pointer receivers for state modification, large structs (3+ fields), or when consistency is needed
- Use value receivers otherwise
Context Usage
Context Parameter
- Always pass as the first parameter
- Use
context.Background()only in main and tests
Testing
Testing Libraries
- Prefer standard library's if + t.Errorf over assertion libraries like testify
- Prefer manual mocking over gomock
Forbidden Practices
init() Functions
- Generally forbidden. Prefer explicit initialization functions
Package Structure
internal Package
- Actively use for libraries, use only when necessary for applications
Recommended Libraries
- Web: Fiber
- DB: Bun, SQLBoiler (when managing migrations externally)
- Logging: slog
- CLI: cobra
- Utilities: samber/lo, golang.org/x/sync
- Configuration: koanf (viper if cobra integration needed)
- Validation: go-playground/validator/v10
- Scheduling: github.com/go-co-op/gocron
- Image processing: github.com/h2non/bimg