| name | go |
| description | Google's official Go style guide. Covers gofmt formatting, naming conventions, error handling, interfaces, concurrency patterns, and package organization. Enforces idiomatic Go code with short variable names and explicit error checks. |
Google Go Style Guide
Official Google Go coding standards for idiomatic, maintainable code.
Golden Rules
- Run
gofmt before commit — formatting is non-negotiable
- Short variable names in small scopes —
i, err, ctx
- Error handling, not exceptions — check every error
- Interfaces for abstraction — accept interfaces, return structs
- Defer for cleanup — ensure resources are released
- Explicit is better — avoid magic, prefer clarity
- Package names: lowercase, single word — no underscores
Quick Reference
Naming Conventions
| Element | Convention | Example |
|---|
| Packages | lowercase | package user |
| Files | lowercase_underscore | user_service.go |
| Types | UpperCamelCase | UserService |
| Functions/Methods | UpperCamelCase (exported) | GetUser |
| Functions/Methods | lowerCamelCase (unexported) | getUserByID |
| Variables | lowerCamelCase | userCount |
| Constants | UpperCamelCase or UPPER_SNAKE | MaxRetries |
| Interfaces | UpperCamelCase + -er suffix | Reader, Writer |
Variables
for i := 0; i < 10; i++ {
}
func ProcessUserData(userRepository UserRepository) error {
}
for index := 0; index < 10; index++ {
}
Error Handling
user, err := getUser(id)
if err != nil {
return nil, fmt.Errorf("failed to get user: %w", err)
}
user, _ := getUser(id)
Functions
func GetUser(id int) (*User, error) {
}
func ParseConfig(path string) (cfg *Config, err error) {
}
Interfaces
type Reader interface {
Read(p []byte) (n int, err error)
}
func ProcessData(r Reader) (*Result, error) {
}
Defer
func ReadFile(path string) ([]byte, error) {
f, err := os.Open(path)
if err != nil {
return nil, err
}
defer f.Close()
return io.ReadAll(f)
}
Goroutines and Channels
func ProcessItems(ctx context.Context, items []Item) error {
for _, item := range items {
select {
case <-ctx.Done():
return ctx.Err()
default:
if err := process(item); err != nil {
return err
}
}
}
return nil
}
results := make(chan Result, len(items))
Package Organization
package user
import (
"context"
"fmt"
"github.com/pkg/errors"
"myapp/internal/db"
)
Common Mistakes
| Mistake | Correct Approach |
|---|
| Ignoring errors | Check every error |
| Long variable names in loops | Use short names (i, j) |
| Panic for normal errors | Return errors |
| Naked returns | Use explicit returns |
| Not running gofmt | Always format code |
| Underscores in package names | Use single lowercase word |
When to Use This Guide
- Writing new Go code
- Refactoring existing Go
- Code reviews
- Setting up linting rules (golangci-lint)
- Onboarding new team members
Install
npx skills add testdino-hq/google-styleguides-skills/go
Full Guide
See go.md for complete details, examples, and edge cases.