Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
cxuu avatar

Go Control Flow

  • 891 installs
  • 137 repo stars
  • Updated June 20, 2026
  • cxuu/golang-skills

go-control-flow is a Go language skill that teaches blank identifier `_` patterns for safe error handling, side-effect imports, and compile-time interface checks for developers who write idiomatic Go services and CLIs.

About

go-control-flow is a Go coding skill from cxuu/golang-skills that documents when and how to use the blank identifier `_` in real Go programs. The skill covers discarding unwanted values from multi-assignment expressions, importing packages purely for side effects, and asserting interface compliance at compile time without runtime overhead. It also warns against silently discarding errors that cause nil-pointer panics, with examples using `os.Stat`, `if _, err :=` patterns, and documented intentional ignores. Developers reach for go-control-flow when reviewing Go error-handling code, refactoring imports, or enforcing interface contracts during backend or CLI implementation.

  • Safely discards values from multi-return functions while preserving error checks
  • Enables clean side-effect package imports using the blank identifier
  • Performs compile-time interface compliance verification with nil pointer checks
  • Prevents nil-pointer panics by never silently discarding errors
  • Documents intentional error ignores with explanatory comments

Go Control Flow by the numbers

  • 891 all-time installs (skills.sh)
  • +39 installs in the week ending Aug 5, 2026 (Skillselion tracking)
  • Ranked #452 of 4,347 Backend & APIs skills by installs in the Skillselion catalog
  • Security screen: LOW risk (skills.sh audit)
  • Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/cxuu/golang-skills --skill go-control-flow

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs891
repo stars137
Security audit3 / 3 scanners passed
Last updatedJune 20, 2026
Repositorycxuu/golang-skills

How do you use Go's blank identifier safely?

Master Go's blank identifier patterns for safe error handling, side-effect imports, and compile-time interface checks.

Who is it for?

Go backend and CLI developers who want compile-time safety patterns and disciplined error handling with the blank identifier.

Skip if: Developers not writing Go, or teams that need database schema, API design, or deployment guidance instead of language idioms.

When should I use this skill?

The user edits Go code involving multi-value returns, blank imports, interface compliance checks, or questionable `_` error discards.

What you get

Idiomatic Go snippets using `_` for discarded values, side-effect imports, interface checks, and documented error-ignore cases.

  • idiomatic Go code snippets
  • documented error-handling decisions

Files

SKILL.mdMarkdownGitHub ↗

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 err := file.Chmod(0664); err != nil {
    log.Print(err)
    return err
}

If you need the variable beyond a few lines after the if, declare it separately and use a standard if instead:

x, err := f()
if err != nil {
    return err
}
// lots of code that uses x

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:

f, err := os.Open(name)
if err != nil {
    return err
}
d, err := f.Stat()
if err != nil {
    f.Close()
    return err
}
codeUsing(f, d)

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:

f, err := os.Open(name)  // declares f and err
d, err := f.Stat()       // declares d, reassigns err

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:

// Bug: ctx inside the if block shadows the outer ctx
if *shortenDeadlines {
    ctx, cancel := context.WithTimeout(ctx, 3*time.Second)
    defer cancel()
}
// ctx here is still the original — the shadowed ctx didn't escape

// Fix: use = instead of :=
var cancel func()
ctx, cancel = context.WithTimeout(ctx, 3*time.Second)

---

For Loops

Go's for is its only looping construct, unifying while, do-while, and C-style for:

// Condition-only (Go's "while")
for x > 0 {
    x = process(x)
}

// Infinite loop
for {
    if done() { break }
}

// C-style three-component
for i := 0; i < n; i++ { ... }

Range

range iterates over slices, maps, strings, and channels:

for i, v := range slice { ... }   // index + value
for k, v := range myMap { ... }   // key + value (non-deterministic order)
for i, r := range "héllo" { ... } // byte index + rune (not byte)
for v := range ch { ... }         // receives until channel closed

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:

for i, j := 0, len(a)-1; i < j; i, j = i+1, j-1 {
    a[i], a[j] = a[j], a[i]
}

++ 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:

Loop:
    for _, v := range items {
        switch v.Type {
        case "done":
            break Loop  // breaks the for 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.

---

Quick Reference

PatternGo Idiom
If initializationif err := f(); err != nil { }
Early returnOmit else when if body returns
Redeclaration:= reassigns if same scope + new var
Shadowing trap:= in inner scope creates new variable
Parallel assignmenti, j = i+1, j-1
Expression-less switchswitch { case cond: }
Comma casescase 'a', 'b', 'c':
No fallthroughDefault behavior (explicit fallthrough if needed)
Break from loop in switchbreak Label
Discard value_, err := f()
Side-effect importimport _ "pkg"
Interface checkRoute to go-interfaces

---

Related Skills

  • Error flow: See go-error-handling when structuring guard clauses, early returns, or error-first patterns
  • Type switches: See go-interfaces when using type switches, the comma-ok idiom, or interface satisfaction checks
  • Nesting reduction: See go-style-core when reducing nesting depth or resolving formatting questions
  • Variable scoping: See go-declarations when using if-init, := redeclaration, or reducing variable scope

Related skills

How it compares

Pick go-control-flow for Go-specific `_` idioms rather than general debugging or architecture skills.

FAQ

What does the blank identifier do in Go?

go-control-flow explains that `_` discards unwanted values from multi-return expressions, enables side-effect-only imports, and verifies interface compliance at compile time without allocating variables.

When should you not use `_` for errors in Go?

go-control-flow warns that discarding errors from calls like `os.Stat` can cause nil-pointer dereferences; the skill recommends handling or explicitly documenting any intentional error ignore.

Is Go Control Flow safe to install?

skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.

Backend & APIsbackendintegrations

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.