# Uber Go Style Guide

- [Introduction](intro.md)
- Guidelines
  - [Pointers to Interfaces](interface-pointer.md)
  - [Verify Interface Compliance](interface-compliance.md)
  - [Receivers and Interfaces](interface-receiver.md)
  - [Zero-value Mutexes are Valid](mutex-zero-value.md)
  - [Copy Slices and Maps at Boundaries](container-copy.md)
  - [Defer to Clean Up](defer-clean.md)
  - [Channel Size is One or None](channel-size.md)
  - [Start Enums at One](enum-start.md)
  - [Use `"time"` to handle time](time.md)
  - Errors
    - [Error Types](error-type.md)
    - [Error Wrapping](error-wrap.md)
    - [Error Naming](error-name.md)
  - [Handle Type Assertion Failures](type-assert.md)
  - [Don't Panic](panic.md)
  - [Use go.uber.org/atomic](atomic.md)
  - [Avoid Mutable Globals](global-mut.md)
  - [Avoid Embedding Types in Public Structs](embed-public.md)
  - [Avoid Using Built-In Names](builtin-name.md)
  - [Avoid `init()`](init.md)
  - [Exit in Main](exit-main.md)
    - [Exit Once](exit-once.md)
  - [Use field tags in marshaled structs](struct-tag.md)
  - [Don't fire-and-forget goroutines](goroutine-forget.md)
    - [Wait for goroutines to exit](goroutine-exit.md)
    - [No goroutines in `init()`](goroutine-init.md)
- [Performance](performance.md)
  - [Prefer strconv over fmt](strconv.md)
  - [Avoid string-to-byte conversion](string-byte-slice.md)
  - [Prefer Specifying Container Capacity](container-capacity.md)
- Style
  - [Avoid overly long lines](line-length.md)
  - [Be Consistent](consistency.md)
  - [Group Similar Declarations](decl-group.md)
  - [Import Group Ordering](import-group.md)
  - [Package Names](package-name.md)
  - [Function Names](function-name.md)
  - [Import Aliasing](import-alias.md)
  - [Function Grouping and Ordering](function-order.md)
  - [Reduce Nesting](nest-less.md)
  - [Unnecessary Else](else-unnecessary.md)
  - [Top-level Variable Declarations](global-decl.md)
  - [Prefix Unexported Globals with _](global-name.md)
  - [Embedding in Structs](struct-embed.md)
  - [Local Variable Declarations](var-decl.md)
  - [nil is a valid slice](slice-nil.md)
  - [Reduce Scope of Variables](var-scope.md)
  - [Avoid Naked Parameters](param-naked.md)
  - [Use Raw String Literals to Avoid Escaping](string-escape.md)
  - Initializing Structs
    - [Use Field Names to Initialize Structs](struct-field-key.md)
    - [Omit Zero Value Fields in Structs](struct-field-zero.md)
    - [Use `var` for Zero Value Structs](struct-zero.md)
    - [Initializing Struct References](struct-pointer.md)
  - [Initializing Maps](map-init.md)
  - [Format Strings outside Printf](printf-const.md)
  - [Naming Printf-style Functions](printf-name.md)
- Patterns
  - [Test Tables](test-table.md)
  - [Functional Options](functional-option.md)
- [Linting](lint.md)
