go-naming

Use when naming any Go identifier — packages, types, functions, methods, variables, constants, or receivers — to ensure idiomatic, clear names. Also use when a user is creating new types, packages, or exported APIs, even if they don't explicitly ask about naming conventions. Does not cover package o

By cxuu · 1,088 installs

npx skills add cxuu/golang-skills --skill go-naming

Source repository · Upstream listing

Go Naming Conventions Resource Routing scripts/check naming.sh Run when checking SCREAMING SNAKE CASE constants, Get prefixed getters, generic package names, or receivers named this / self . references/IDENTIFIERS.md Read when choosing names for initialisms, exported identifiers, or package level symbols. references/REPETITION.md Read when names repeat package, receiver, type, or local context. references/VARIABLES.md Read when choosing local variable names, receiver names, or loop identifiers. Core Principle Names should: Not feel repetitive when used Take context into consideration Not repeat concepts that are already clear Naming is more art than science—Go names tend to be shorter than in other languages. Naming Decision Flow MixedCaps (Required) Normative : All Go identifiers must use MixedCaps. Underscores are allowed only in: test functions ( TestFoo InvalidInput ), generated code, and OS/cgo interop. Package Names Normative : Packages must be lowercase with no underscores. Short, lowercase, singular nouns. Avoid generic names like util , common , helper — prefer specific names: stringutil , httpauth , configloader . Interface Names Advisory : One method interfaces use " er" suffix. Name one method interfaces by the method plus er : Reader , Writer , Formatter . Honor canonical method names ( Read , Write , Close , String ) and their signatures. Receiver Names Normative : Receivers must be short abbreviations, used consistently. One or two letters abbreviating the type, consistent across all methods: func (c Client) Connect() , func (c Client) Send() . Never use this or self . Constant Names Normative : Constants use MixedCaps, never ALL CAPS or K prefix. Name constants by role, not value: MaxRetries not Three , DefaultPort not Port8080 . Initialisms and Acronyms Normative : Initialisms maintain consistent case throughout. Initialisms (URL, ID, HTTP, API) must be all uppercase or all lowercase: HTTPClient , userID , ParseURL() — not HttpClient , orderId , ParseUrl() . Function and Method Names Advisory : No Get prefix for simple accessors; use verb like names for actions. Getter for field owner is Owner() , not GetOwner() . Setter is SetOwner() . Use Compute or Fetch for expensive operations. When functions differ only by type, include type at the end: ParseInt() , ParseInt64() . Variable Names Variable naming balances brevity with clarity. Key principles: Scope based length : Short names ( i , v ) for small scopes; longer, descriptive names for larger scopes Single letter conventions : Use familiar patterns ( i for index, r / w for reader/writer) Avoid type in name : Use users not userSlice , name not nameString Prefix unexported globals : Use prefix for package level unexported vars/consts to prevent shadowing Avoiding Repetition Go names should not feel repetitive when used. Consider the full context: Package + symbol : widget.New() not widget.NewWidget() Receiver + method : p.Name() not p.ProjectName() Context + type : In package sqldb , use Connection not DBConnection Avoid Built In Names Never shadow Go's predeclared identifiers ( error , string , len , cap , append , copy , new , make , etc.) as variable, parameter, or type names. For detailed guidance : See go declarations — "Avoid Using Built In Names" section. Quick Reference Element Rule Example Package lowercase, no underscores package httputil Exported MixedCaps, starts uppercase func ParseURL() Unexported mixedCaps, starts lowercase func parseURL() Receiver 1 2 letter abbreviation func (c Client) Constant MixedCaps, never ALL CAPS const MaxSize = 100 Initialism consistent case userID , XMLAPI Variable length ~ scope size i (small), userCount (large) Built in names Never shadow predeclared identifiers See go declarations Validation : After renaming identifiers, run bash scripts/check naming.sh to verify no naming anti patterns remain. Then run go build ./... to confirm the rename didn't break anything. Related Skills Interface naming : See [go interfaces](../go interfaces/SKILL.md) when naming interfaces with the er suffix or choosing receiver types Package naming : See [go packages](../go packages/SKILL.md) when naming packages, avoiding util / common , or resolving import collisions Error naming : See [go error handling](../go error handling/SKILL.md) when naming sentinel errors ( ErrFoo ) or custom error types Declaration scope : See [go declarations](../go declarations/SKILL.md) when variable name length depends on scope or when avoiding built in shadowing Style principles : See [go style core](../go style core/SKILL.md) when balancing clarity vs concision in identifier names