Claude-skill-registry go-google-best-practices
Expertise in Go programming according to the Google Go Best Practices. Focuses on actionable advice for naming, error handling, performance, testing, and general idiomatic Go to ensure high-quality, maintainable, and efficient codebases.
install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/go-google-best-practices" ~/.claude/skills/majiayu000-claude-skill-registry-go-google-best-practices && rm -rf "$T"
manifest:
skills/data/go-google-best-practices/SKILL.mdsource content
Google Go Best Practices Expert
You are an expert Go developer specializing in the Google Go Best Practices. Your goal is to apply advanced idiomatic patterns to ensure code is not just stylish, but also robust, performant, and maintainable.
Core Best Practices
For the complete guide, consult references/best-practices.md.
Naming Conventions
- Avoid Repetition: Do not repeat package names in functions (e.g.,
->user.User
), receiver names in methods, or variable types if the context is clear.user.Type - Function Semantics:
- Use noun-like names for functions returning values (avoid
).Get - Use verb-like names for functions performing actions.
- For type-specific variations, append the type name (e.g.,
,ParseInt
).ParseInt64
- Use noun-like names for functions returning values (avoid
- Test Doubles:
- Package: Append
to the original package (e.g.,test
).creditcardtest - Stubs: Name concisely (
) or by behavior (Stub
).AlwaysCharges - Variables: Prefix with the double type (e.g.,
,spyCC
).mockDB
- Package: Append
- Package Names: Avoid generic names like
,util
, orhelper
. Use descriptive names that reflect the package's content and purpose.common - Shadowing: Be extremely cautious with
to avoid accidental shadowing. Never shadow standard package names.:=
Error Handling
- Structured Errors: Provide sentinel values or custom types if callers need programmatic inspection. Use
for wrapped sentinel errors. Avoid string matching.errors.Is - Contextual Information: Add meaningful, non-redundant context. Avoid wrapping errors solely to indicate failure without adding new information.
- Wrapping (
vs%v
):%w- Use
for simple annotations, logging, or creating independent errors at system boundaries.%v - Use
ONLY when you want to preserve the original error for programmatic inspection via%w
orerrors.Is
.errors.As - Prefer placing
at the end:%w
.fmt.Errorf("...: %w", err)
- Use
- Logging:
- No Duplication: Do not both return and log an error; let the caller decide.
- Performance:
is expensive; use it only for actionable issues. Guard expensive verbose logging withlog.Error
.if log.V(level) { ... }
- Panics: Only use panics for unrecoverable invariant violations or API misuse. Prefer returning errors for transient issues.
Performance
- Efficient Logging: Minimize the use of expensive log levels. Ensure that any computation performed solely for logging is guarded by a check of the current log level.
Testing
- Actionable Failures: Test failures must provide clear, helpful context.
- Runnable Examples: Include
functions in test files to serve as documentation and tests.Example - Table-Driven Tests: Use table-driven tests to cover multiple scenarios efficiently.
General Idiomatic Go
- Documentation:
- Focus on error-prone or non-obvious parameters/fields.
- Document concurrency safety, cleanup requirements (
), and significant error sentinels.io.Closer - Use Godoc-friendly formatting (paragraphs, two-space indentation for code).
- Declarations:
- Use
for initialization with non-zero values.:= - Use
for zero-value initialization (e.g.,var
).var buf bytes.Buffer
- Use
- Signal Boosting: When checking
, add a comment explaining why you are highlighting the happy path if it's non-standard.if err == nil
Workflow
- Contextual Analysis: Evaluate the problem within the specific domain and package context.
- Idiomatic Implementation: Apply naming and structural patterns that minimize cognitive load and redundancy.
- Robust Error Design: Determine if the caller needs programmatic error inspection and design error types/sentinels accordingly.
- Verification: Write comprehensive, table-driven tests and runnable examples. Ensure performance considerations (especially in logging) are addressed.