mirror of
https://github.com/sstent/go-garth.git
synced 2026-03-18 15:35:25 +00:00
sync
This commit is contained in:
97
.kilocode/rules/memory-bank/coding-style.md
Normal file
97
.kilocode/rules/memory-bank/coding-style.md
Normal file
@@ -0,0 +1,97 @@
|
||||
# Go Coding Style Guide
|
||||
|
||||
## Code Organization & Structure
|
||||
|
||||
**Logical Segmentation**
|
||||
- One concept per file (e.g., handlers, models, services).
|
||||
- Keep functions under 20-30 lines when possible.
|
||||
- Use meaningful package names that reflect functionality.
|
||||
- Group related types and functions together.
|
||||
|
||||
**Interface Design**
|
||||
- Prefer small, focused interfaces (1-3 methods).
|
||||
- Define interfaces where they're used, not where they're implemented.
|
||||
- Use composition over inheritance.
|
||||
|
||||
## Conciseness Rules
|
||||
|
||||
**Variable & Function Naming**
|
||||
- Use short names in small scopes (`i`, `err`, `ctx`).
|
||||
- Longer names for broader scopes (`userRepository`, `configManager`).
|
||||
- Omit obvious type information (`users []User` not `userList []User`).
|
||||
|
||||
**Error Handling**
|
||||
```go
|
||||
// Prefer early returns
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// over nested if-else blocks
|
||||
```
|
||||
|
||||
**Type Declarations**
|
||||
- Use type inference: `users := []User{}` not `var users []User = []User{}`.
|
||||
- Combine related variable declarations: `var (name string; age int)`.
|
||||
|
||||
## Go Idioms for Conciseness
|
||||
|
||||
**Zero Values**
|
||||
- Leverage Go's zero values instead of explicit initialization.
|
||||
- Use `var buf bytes.Buffer` instead of `buf := bytes.Buffer{}`.
|
||||
|
||||
**Struct Initialization**
|
||||
```go
|
||||
// Prefer struct literals with field names
|
||||
user := User{Name: name, Email: email}
|
||||
// over multiple assignments
|
||||
```
|
||||
|
||||
**Method Receivers**
|
||||
- Use pointer receivers for modification or large structs.
|
||||
- Use value receivers for small, immutable data.
|
||||
|
||||
**Channel Operations**
|
||||
- Use `select` with `default` for non-blocking operations.
|
||||
- Prefer `range` over explicit channel reads.
|
||||
|
||||
## Context Reduction Strategies
|
||||
|
||||
**Function Signatures**
|
||||
- Group related parameters into structs.
|
||||
- Use functional options pattern for complex configurations.
|
||||
- Return early and often to reduce nesting.
|
||||
|
||||
**Constants and Enums**
|
||||
```go
|
||||
const (
|
||||
StatusPending = iota
|
||||
StatusApproved
|
||||
StatusRejected
|
||||
)
|
||||
```
|
||||
|
||||
**Embed Common Patterns**
|
||||
- Use `sync.Once` for lazy initialization.
|
||||
- Embed `sync.Mutex` in structs needing synchronization.
|
||||
- Use `context.Context` as first parameter in functions.
|
||||
|
||||
## File Organization Rules
|
||||
|
||||
**Package Structure**
|
||||
```
|
||||
/cmd - main applications
|
||||
/internal - private code
|
||||
/pkg - public libraries
|
||||
/api - API definitions
|
||||
```
|
||||
|
||||
**Import Grouping**
|
||||
1. Standard library
|
||||
2. Third-party packages
|
||||
3. Local packages
|
||||
(Separate groups with blank lines)
|
||||
|
||||
**Testing**
|
||||
- Place tests in same package with `_test.go` suffix.
|
||||
- Use table-driven tests for multiple scenarios.
|
||||
- Keep test functions focused and named clearly.
|
||||
Reference in New Issue
Block a user