AgentSkillsCN

go-style

遵循 Uber Go 风格指南,涵盖准则、性能优化与代码风格。适用于编写或审查 Go 代码时,确保代码风格符合规范。

SKILL.md
--- frontmatter
name: go-style
description: Uber Go style guide rules for guidelines, performance, and code style. Use when writing or reviewing Go code for style compliance.
userInvokable: true

Go Style (Uber Guide)

References: Uber Go Style Guide | Examples

Guidelines

Examples

RuleDoDon't
Interface pointersfunc(w io.Writer)func(w *io.Writer)
Interface compliancevar _ Interface = (*T)(nil)Runtime check only
ReceiversConsistent pointer (s *Service)Mix value/pointer on same type
Zero-value mutexvar mu sync.Mutex (ready to use)mu := new(sync.Mutex)
Slice/map boundariesCopy at API boundariesReturn/store internal slices/maps
DeferFor cleanup, outside loopsdefer inside loops
Channel size0 (sync) or 1 (async)Arbitrary buffer sizes
EnumsStart at 1 if zero invalidStart at 0 when zero is invalid
Timetime.Time, time.Durationint64 for timestamps/durations
Error typesvar ErrFoo = errors.New()String comparison
Error wrappingfmt.Errorf("...: %w", err)fmt.Errorf("...: %s", err)
Error namingErrFoo, FooError typeFooErr, ErrorFoo
Error handlingHandle once, immediately with :=Log and return, var err at top
Type assertionv, ok := x.(T) check okv := x.(T) panics
Panicmust.Must in cmd/, internal/apps/ onlyPanic in usecases/clients/repos
Atomicgo.uber.org/atomicsync/atomic directly
Global stateDependency injectionMutable globals
EmbeddingPrivate structs onlyEmbed types in public structs
Built-in namesCustom namesShadow error, int, string, etc
init()Avoid, or deterministic onlyComplex logic in init()
Exitos.Exit only in main()os.Exit in library
Field tagsAlways on marshaled structsMissing json: tags
GoroutinesManaged lifecycle, wait groupsFire-and-forget, goroutines in init()

Performance

Examples

RuleDoDon't
Int conversionstrconv.Itoa(n)fmt.Sprintf("%d", n)
String/byteReuse []byte, minimize conversionRepeated []byte(s) in loops
Map capacitymake(map[K]V, hint)Grow map incrementally
Slice capacitymake([]T, 0, cap)Append without capacity

Style

Examples

RuleDoDon't
Line length~99 chars, break logicallyOverly long lines
ConsistencyMatch surrounding code styleMix styles in same file
DeclarationsGroup similar var, const, typeScatter related declarations
Importsstdlib → external → internalMixed import groups
Package namesShort, lowercase, singular_, util, common, base
Function namesMarshalJSON, no stutteringjson.JSONMarshal
Import aliasOnly on conflictUnnecessary aliases
Function orderExported first, by receiver, call orderRandom ordering
NestingEarly return, max 2 levelsDeep nesting
ElseOmit after return/break/continueif x { return } else { ... }
Top-level varvar x = ... not :=:= at package level
Unexported globalsvar _cache = ...var cache (no underscore)
Struct embeddingEmbed interfaces, mutex privateEmbed concrete types publicly
Local var:= for most, var for zerovar x int = 0
Nil sliceReturn nil not []T{}Empty literal when nil works
Variable scopeDeclare near use, reduce scopeAll vars at function top
Naked parametersStruct for 3+ paramsfunc(a, b, c, d, e string)
Raw strings`json:"x"`"json:\"x\""
Struct initField names {Name: "x"}Positional {"x", 1}
Zero fieldsOmit zero value fields{Name: "", Count: 0}
Zero structvar s Ss := S{}
Struct refs&S{Name: "x"}s := S{}; return &s
Map initmake(map[K]V) or literalnil map then assign
Printf formatDefine outside callFormat strings inline
Printf namingFoof(format, ...)FooFormat, FooPrintf
GettersName()GetName()
ConstantsNamed constantsMagic numbers