go-declarations

Use when declaring or initializing Go variables, constants, structs, or maps — including var vs :=, reducing scope with if-init, formatting composite literals, designing iota enums, and using any instead of interface{}. Also use when writing a new struct or const block, even if the user doesn't ask

By cxuu · 861 installs

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

Source repository · Upstream listing

Go Declarations and Initialization Compatibility: Examples may use any , which requires Go 1.18+. Resource Routing references/SCOPE.md Read when deciding between var , := , if init, and narrow variable scope. references/IOTA.md Read when designing constants or enum like values. references/INITIALIZATION.md Read when initializing structs, maps, zero values, or pointers. references/LITERALS.md Read for composite literal formatting and keyed field tradeoffs. references/STRUCTS.md Read when designing or initializing structs. references/SHADOWING.md Read when a declaration may shadow a builtin or outer variable. Quick Reference: var vs := Context Use Example Top level var (always) var s = F() Local with value := s := "foo" Local zero value (intentional) var var filtered []int Type differs from expression var with type var e error = F() Group Similar Declarations Group related var , const , type in parenthesized blocks. Separate unrelated declarations into distinct blocks. Inside functions, group adjacent vars even if unrelated: Constants and iota Start enums at one so the zero value represents invalid/unset: Use zero when the default behavior is desirable (e.g., LogToStdout ). Variable Scope Use if init to limit scope when the result is only needed for the error check: Don't reduce scope if it forces deeper nesting or you need the result outside the if . Move constants into functions when only used there. Initializing Structs Always use field names (enforced by go vet ). Exception: test tables with ≤3 fields. Omit zero value fields — let Go set defaults. Use var for zero value structs : var user User not user := User{} Use &T{} over new(T) : sptr := &T{Name: "bar"} Composite Literal Formatting Use field names for external package types. Match closing brace indentation with the opening line. Omit repeated type names in slice/map literals ( gofmt s ). Initializing Maps Scenario Use Example Empty, populated later make(map[K]V) m := make(map[string]int) Nil declaration var var m map[string]int Fixed entries at init Literal m := map[string]int{"a": 1} make() visually distinguishes empty but initialized from nil. Use size hints when the count is known. Raw String Literals Use backtick strings to avoid hand escaped characters: Ideal for regex, SQL, JSON, and multi line text. Prefer any Over interface{} Go 1.18+: use any instead of interface{} in all new code. Avoid Shadowing Built In Names Never use predeclared identifiers ( error , string , len , cap , append , copy , new , make , close , delete , panic , recover , any , true , false , nil , iota ) as names. Use go vet to detect. Related Skills Naming conventions : See [go naming](../go naming/SKILL.md) when choosing variable names, constant names, or deciding name length by scope Data structures : See [go data structures](../go data structures/SKILL.md) when choosing between new and make , or initializing slices and maps Control flow scoping : See [go control flow](../go control flow/SKILL.md) when using if init, := redeclaration, or avoiding variable shadowing Capacity hints : See [go performance](../go performance/SKILL.md) when pre allocating maps or slices with known sizes