Skip to content
Skill Authoring
Skill

/go-packages

Use when creating Go packages, organizing imports, managing dependencies, or deciding how to structure Go code into packages. Also use when starting a new Go project or splitting a growing codebase into packages, even if the user doesn't explicitly ask about package

BOOST
From plugin
golang-skills
18120 skills
Install
$ npx -y skills add cxuu/golang-skills --skill go-packages --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/go-packages

Context preview

The summary Claude sees to decide when to auto-load this skill.

Use when creating Go packages, organizing imports, managing dependencies, or deciding how to structure Go code into packages. Also use when starting a new Go project or splitting a growing codebase into packages, even if the user doesn't explicitly ask about package

SKILL.md

go-packages.SKILL.md
name: go-packages
description: Use when creating Go packages, organizing imports, managing dependencies, or deciding how to structure Go code into packages. Also use when starting a new Go project or splitting a growing codebase into packages, even if the user doesn't explicitly ask about package organization. Does not cover naming individual identifiers (see go-naming).

Go Packages and Imports

Resource Routing

  • `references/IMPORTS.md` - Read when grouping imports, using blank imports, dot imports, or import aliases.
  • `references/PACKAGE-SIZE.md` - Read when splitting packages, avoiding `init`, structuring `main`, or designing CLI flags/subcommands.

> **When this skill does NOT apply**: For naming individual identifiers within a package, see [go-naming](../go-naming/SKILL.md). For organizing functions within a single file, see [go-functions](../go-functions/SKILL.md). For configuring linters that enforce import rules, see [go-linting](../go-linting/SKILL.md).

Package Organization

Avoid Util Packages

Package names should describe what the package provides. Avoid generic names like `util`, `helper`, `common` — they obscure meaning and cause import conflicts.

// Good: Meaningful package names
db := spannertest.NewDatabaseFromFile(...)
_, err := f.Seek(0, io.SeekStart)

// Bad: Vague names obscure meaning
db := test.NewDatabaseFromFile(...)
_, err := f.Seek(0, common.SeekStart)

Generic names can be used as *part* of a name (e.g., `stringutil`) but should not be the entire package name.

Package Size

| Question | Action | |----------|--------| | Can you describe its purpose in one sentence? | No → split by responsibility | | Do files never share unexported symbols? | Those files could be separate packages | | Distinct user groups use different parts? | Split along user boundaries | | Godoc page overwhelming? | Split to improve discoverability |

**Do NOT split** just because a file is long, to create single-type packages, or if it would create circular dependencies.

---

Imports

Imports are organized in groups separated by blank lines. Standard library packages always come first. Use [goimports](https://pkg.go.dev/golang.org/x/tools/cmd/goimports) to manage this automatically.

import (
    "fmt"
    "os"

    "github.com/foo/bar"
    "rsc.io/goversion/version"
)

**Quick rules:**

| Rule | Guidance | |------|----------| | Grouping | stdlib first, then external. Extended: stdlib → other → protos → side-effects | | Renaming | Avoid unless collision. Rename the most local import. Proto packages get `pb` suffix | | Blank imports (`import _`) | Only in `main` packages or tests | | Dot imports (`import .`) | Never use, except for circular-dependency test files |

---

Avoid init()

Avoid `init()` where possible. When unavoidable, it must be:

1. Completely deterministic 2. Independent of other `init()` ordering 3. Free of environment state (env vars, working dir, args) 4. Free of I/O (filesystem, network, system calls)

**Acceptable uses**: complex expressions that can't be single assignments, pluggable hooks (e.g., `database/sql` dialects), deterministic precomputation.

---

Exit in Main

Call `os.Exit` or `log.Fatal*` **only in `main()`**. All other functions should return errors.

**Why**: Non-obvious control flow, untestable, `defer` statements skipped.

**Best practice**: Use the `run()` pattern — extract logic into `func run() error`, call from `main()` with a single exit point:

func main() {
    if err := run(); err != nil {
        log.Fatal(err)
    }
}

---

Command-Line Flags

> **Advisory**: Define flags only in `package main`.

  • Flag names use `snake_case`: `--output_dir` not `--outputDir`
  • Libraries should accept configuration as parameters, not read flags directly —

this keeps them testable and reusable

  • Prefer the standard `flag` package; use `pflag` only when POSIX conventions

(double-dash, single-char shortcuts) are required

// Good: Flag in main, passed as parameter to library
func main() {
    outputDir := flag.String("output_dir", ".", "directory for output files")
    flag.Parse()
    if err := mylib.Generate(*outputDir); err != nil {
        log.Fatal(err)
    }
}

---

Related Skills

  • **Package naming**: See [go-naming](../go-naming/SKILL.md) when choosing package names, avoiding stuttering, or naming exported symbols
  • **Error handling across packages**: See [go-error-handling](../go-error-handling/SKILL.md) when wrapping errors at package boundaries with `%w` vs `%v`
  • **Import linting**: See [go-linting](../go-linting/SKILL.md) when configuring goimports local-prefixes or enforcing import grouping
  • **Global state**: See [go-defensive](../go-defensive/SKILL.md) when replacing `init()` with explicit initialization or avoiding mutable globals
Read more
Ships withgolang-skills

AI Agent Skills for writing idiomatic, production-quality Go code. 20 modular skills teach AI coding assistants Go best practices derived from: Google Go Style Guide Effective Go Uber Go Style Guide Go Wiki CodeReviewComments Skills are tuned following

Get the whole plugin
Stats
181
Stars
19
Forks
Maintained
Maintenance
HTML
Language
Apache-2.0
License
4mo ago
Last commit
8mo ago
Created
3d ago
Added

Repo: cxuu/golang-skills

Other skills on golang-skills.