go-control-flow

Use when writing conditionals, loops, or switch statements in Go — including if with initialization, early returns, for loop forms, range, switch, type switches, and blank identifier patterns. Also use when writing a simple if/else or for loop, even if the user doesn't mention guard clauses or varia

By cxuu · 1,055 installs

npx skills add cxuu/golang-skills --skill go-control-flow

Source repository · Upstream listing

Go Control Flow Resource Routing references/SWITCH PATTERNS.md Read when using switch statements, type switches, fallthrough, or labeled breaks. references/BLANK IDENTIFIER.md Read when using , blank imports, unused compile time assertions, or intentional discards. If with Initialization if and switch accept an optional initialization statement. Use it to scope variables to the conditional block: If you need the variable beyond a few lines after the if , declare it separately and use a standard if instead: Indent Error Flow (Guard Clauses) When an if body ends with break , continue , goto , or return , omit the unnecessary else . Keep the success path unindented: Never bury normal flow inside an else when the if already returns. Redeclaration and Reassignment The := short declaration allows redeclaring variables in the same scope: A variable v may appear in a := declaration even if already declared, provided: 1. The declaration is in the same scope as the existing v 2. The value is assignable to v 3. At least one other variable is newly created by the declaration Variable Shadowing Warning : If v is declared in an outer scope, := creates a new variable that shadows it — a common source of bugs: For Loops Go's for is its only looping construct, unifying while , do while , and C style for : Range range iterates over slices, maps, strings, and channels: Key rules: Range over strings yields runes , not bytes — i is the byte offset Range over maps has non deterministic order — don't rely on it Use to discard the index or value: for , v := range slice Parallel Assignment Go has no comma operator. Use parallel assignment for multiple loop variables: ++ and are statements, not expressions — they cannot appear in parallel assignment. Switch: Labeled Break break inside a switch within a for loop only breaks the switch. Use a labeled break to exit the enclosing loop: For type switches, see go interfaces : Type Switch. The Blank Identifier Never discard errors carelessly — a nil dereference panic may follow. Route compile time interface assertions to [go interfaces](../go interfaces/SKILL.md). Quick Reference Pattern Go Idiom If initialization if err := f(); err != nil { } Early return Omit else when if body returns Redeclaration := reassigns if same scope + new var Shadowing trap := in inner scope creates new variable Parallel assignment i, j = i+1, j 1 Expression less switch switch { case cond: } Comma cases case 'a', 'b', 'c': No fallthrough Default behavior (explicit fallthrough if needed) Break from loop in switch break Label Discard value , err := f() Side effect import import "pkg" Interface check Route to go interfaces Related Skills Error flow : See [go error handling](../go error handling/SKILL.md) when structuring guard clauses, early returns, or error first patterns Type switches : See [go interfaces](../go interfaces/SKILL.md) when using type switches, the comma ok idiom, or interface satisfaction checks Nesting reduction : See [go style core](../go style core/SKILL.md) when reducing nesting depth or resolving formatting questions Variable scoping : See [go declarations](../go declarations/SKILL.md) when using if init, := redeclaration, or reducing variable scope