Expertise in Go programming decisions according to the Google Go Style Guide. Focuses on specific choices for naming, error handling, and language usage.
Scanned 2/10/2026
Install via CLI
openskills install majiayu000/claude-skill-registry---
name: go-google-style-decisions
description: Expertise in Go programming decisions according to the Google Go Style Guide. Focuses on specific choices for naming, error handling, and language usage.
metadata:
short-description: Google Go Style Decisions for idiomatic and consistent code.
---
# go-google-style-decisions
This skill provides expert guidance on the "Decisions" portion of the Google Go Style Guide. It focuses on the specific choices and trade-offs made to ensure consistency, readability, and maintainability across large Go codebases.
## Core Mandates
1. **Clarity over Conciseness**: While Go favors brevity, never sacrifice clarity.
2. **Consistency is Key**: Adhere to established patterns in the codebase.
3. **Idiomaticity**: Follow Go-specific patterns (e.g., error handling, interface usage).
4. **No Underscores**: Avoid underscores in names except in specifically allowed cases (tests, generated code).
## Developer Workflow
1. **Design**: Plan APIs following the "Least Mechanism" principle.
2. **Implement**: Write code adhering to the style decisions detailed below.
3. **Lint**: Use `golangci-lint` or `go vet` to catch common style violations.
4. **Test**: Include runnable examples in `_test.go` files for public APIs.
5. **Review**: Ensure changes align with the "Core Principles" of clarity and consistency.
## Detailed Guidance
For the complete guide, consult [references/decisions.md](references/decisions.md).
### 1. Naming Conventions
* **Underscores**: Do not use underscores in Go names (e.g., `pkg_name` or `var_name`).
* *Exceptions*: `_test.go` files, generated code, and low-level interop.
* **Package Names**:
* Short, lowercase, single word. No `util` or `common`.
* Avoid common variable names (e.g., `user` as a package name if `user` is a common variable).
* **Receiver Names**:
* Short (1-2 letters).
* Consistently used throughout the type's methods.
* Usually an abbreviation of the type (e.g., `c` for `Client`).
* **Constant Names**:
* Use `MixedCaps` (e.g., `ExportedConst`, `internalConst`).
* Do NOT use `ALL_CAPS` or `kPrefix`.
* **Initialisms**:
* Maintain consistent casing (e.g., `HTTPClient`, `urlPath`, `XMLParser`).
* **Getters**:
* Omit `Get` prefix (e.g., use `obj.Field()` instead of `obj.GetField()`).
* Use `Get` only if the method is truly "getting" something that isn't a simple field (e.g., `GetURL`).
* **Variable Names**:
* Length should be proportional to scope. Short names for small scopes (e.g., `i` in a loop), more descriptive names for larger scopes.
* Omit types from names (e.g., `users` instead of `userSlice`).
### 2. Commentary
* **Line Length**: Aim for ~80 characters. Wrap long comments.
* **Doc Comments**: Every top-level exported name MUST have a doc comment.
* Must start with the name of the object.
* Must be a complete sentence.
* **Examples**: Provide `ExampleXxx` functions in test files to document public APIs.
### 3. Error Handling
* **Error as Last Return**: Always return `error` as the final value.
* **Returning Nil**: Return `nil` for the error value on success.
* **Error Interfaces**: Exported functions should return the `error` interface, not a concrete type.
* **Error Strings**:
* No capitalization (unless proper nouns/acronyms).
* No trailing punctuation.
* **Indentation**: Handle errors early and return/continue. Keep the "happy path" at the minimal level of indentation.
* **No In-band Errors**: Do not use special values (like `-1`) to signal errors. Use `(value, error)` or `(value, ok)`.
### 4. Language Constructs
* **Composite Literals**: Use them for struct initialization. Always specify field names when the struct is from another package.
* **Nil Slices**: Prefer `var s []int` (nil slice) over `s := []int{}` (empty slice).
* Avoid APIs that distinguish between nil and empty slices.
* **Braces**:
* Closing braces should align with the opening statement.
* Avoid "cuddling" (e.g., `if err != nil { ... } else { ... }` is fine, but don't over-compact).
* **Function Formatting**: Keep signatures on one line if possible. If they must wrap, indent the arguments.
### 5. Panic and Recovery
* **Avoid Panic**: Do not use `panic` for normal error handling.
* **Exceptional Only**: Use `panic` only for truly unrecoverable states (e.g., internal invariant failure).
* **Program Termination**: Use `log.Exit` or `log.Fatal` (which calls `os.Exit`) only in `main` or `init` functions.
* **MustXYZ**: Helper functions that terminate the program on failure should be prefixed with `Must` (e.g., `template.Must`).
### 6. Copying
* **Structs with Locks**: Be extremely careful copying structs that contain `sync.Mutex` or other synchronization primitives.
* **Pointer Receivers**: If a type has methods with pointer receivers, avoid copying values of that type.
## References
* [Google Go Style Decisions](https://google.github.io/styleguide/go/decisions)No comments yet. Be the first to comment!