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

Golang Project Layout

  • 34k installs
  • 2.8k repo stars
  • Updated July 27, 2026
  • samber/cc-skills-golang

golang-project-layout is a Go skill teaching project structure conventions including cmd/internal/pkg layout.

About

Go project structure and workspace setup conventions. Covers cmd/internal/pkg directory layout, monorepo patterns, CLI project organization, and decisions about flat vs hierarchical structure - foundational for scalable Go projects.

  • cmd/internal/pkg directory conventions
  • Monorepo and CLI project layouts
  • Guidance on flat vs hierarchical structure

Golang Project Layout by the numbers

  • 33,969 all-time installs (skills.sh)
  • +513 installs in the week ending Jul 28, 2026 (Skillselion tracking)
  • Ranked #8 of 99 Go skills by installs in the Skillselion catalog
  • Security screen: LOW risk (skills.sh audit)
  • Data as of Jul 28, 2026 (Skillselion catalog sync)
npx skills add https://github.com/samber/cc-skills-golang --skill golang-project-layout

Add your badge

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

Listed on Skillselion
Installs34k
repo stars2.8k
Security audit3 / 3 scanners passed
Last updatedJuly 27, 2026
Repositorysamber/cc-skills-golang

What folder structure should a new Go service use?

Developers starting or restructuring Go projects need clear conventions for organizing code into maintainable layouts.

Who is it for?

new Go projects,monorepo setup,CLI applications,scalable codebases

Skip if: existing projects with rigid structure,single-file scripts,learning Go basics

When should I use this skill?

The user starts a new Go project and asks for folder structure, Makefile, project layout, or standard Go repository scaffolding.

What you get

Go project directory tree, Makefile with build/test/lint/benchmark targets, .gitignore patterns, and VERSION ldflags wiring.

  • Project directory tree
  • Makefile
  • .gitignore patterns

By the numbers

  • Covers 69 lines of architectural guidance
  • Addresses cmd/internal/pkg, monorepo, and CLI layouts

Files

SKILL.mdMarkdownGitHub ↗

Persona: You are a Go project architect. You right-size structure to the problem — a script stays flat, a service gets layers only when justified by actual complexity.

Go Project Layout

Architecture Decision: Ask First

When starting a new project, ask the developer what software architecture they prefer (clean architecture, hexagonal, DDD, flat structure, etc.). NEVER over-structure small projects — a 100-line CLI tool does not need layers of abstractions or dependency injection.

→ See samber/cc-skills-golang@golang-design-patterns skill for detailed architecture guides with file trees and code examples.

Dependency Injection: Ask Next

After settling on the architecture, ask the developer which dependency injection approach they want: manual constructor injection, or a DI library (samber/do, google/wire, uber-go/dig+fx), or none at all. The choice affects how services are wired, how lifecycle (health checks, graceful shutdown) is managed, and how the project is structured. See the samber/cc-skills-golang@golang-dependency-injection skill for a full comparison and decision table.

12-Factor App

For applications (services, APIs, workers), follow 12-Factor App conventions: config via environment variables, logs to stdout, stateless processes, graceful shutdown, backing services as attached resources, and admin tasks as one-off commands (e.g., cmd/migrate/).

Quick Start: Choose Your Project Type

Project TypeUse WhenKey Directories
CLI ToolBuilding a command-line applicationcmd/{name}/, internal/, optional pkg/
LibraryCreating reusable code for otherspkg/{name}/, internal/ for private code
ServiceHTTP API, microservice, or web appcmd/{service}/, internal/, api/, web/
MonorepoMultiple related packages/modulesgo.work, separate modules per package
WorkspaceDeveloping multiple local modulesgo.work, replace directives

Module Naming Conventions

Module Name (go.mod)

Your module path in go.mod should:

  • MUST match your repository URL: github.com/username/project-name
  • Use lowercase only: github.com/you/my-app (not MyApp)
  • Use hyphens for multi-word: user-auth not user_auth or userAuth
  • Be semantic: Name should clearly express purpose

Examples:

// ✅ Good
module github.com/jdoe/payment-processor
module github.com/company/cli-tool

// ❌ Bad
module myproject
module github.com/jdoe/MyProject
module utils

Package Naming

Packages MUST be lowercase, singular, and match their directory name. → See samber/cc-skills-golang@golang-naming skill for complete package naming conventions and examples.

Directory Layout

All main packages must reside in cmd/ with minimal logic — parse flags, wire dependencies, call Run(). Business logic belongs in internal/ or pkg/. Use internal/ for non-exported packages, pkg/ only when code is useful to external consumers.

See directory layout examples for universal, small project, and library layouts, plus common mistakes.

Essential Configuration Files

Every Go project should include at the root:

  • Makefile — build automation. See Makefile template
  • .gitignore — git ignore patterns. See .gitignore template
  • .golangci.yml — linter config. See the samber/cc-skills-golang@golang-lint skill for the recommended configuration

For application configuration with Cobra + Viper, see config reference.

Tests, Benchmarks, and Examples

Co-locate _test.go files with the code they test. Use testdata/ for fixtures. See testing layout for file naming, placement, and organization details.

Go Workspaces

Use go.work when developing multiple related modules in a monorepo. See workspaces for setup, structure, and commands.

Initialization Checklist

When starting a new Go project:

  • [ ] Ask the developer their preferred software architecture (clean, hexagonal, DDD, flat, etc.)
  • [ ] Ask the developer their preferred DI approach — see samber/cc-skills-golang@golang-dependency-injection skill
  • [ ] Decide project type (CLI, library, service, monorepo)
  • [ ] Right-size the structure to the project scope
  • [ ] Choose module name (matches repo URL, lowercase, hyphens)
  • [ ] Run go version to detect the current go version
  • [ ] Run go mod init github.com/user/project-name
  • [ ] Create cmd/{name}/main.go for entry point
  • [ ] Create internal/ for private code
  • [ ] Create pkg/ only if you have public libraries
  • [ ] For monorepos: Initialize go work and add modules
  • [ ] Run gofmt -s -w . to ensure formatting
  • [ ] Add .gitignore with /vendor/ and binary patterns

Related Skills

→ See samber/cc-skills-golang@golang-cli skill for CLI tool structure and Cobra/Viper patterns. → See samber/cc-skills-golang@golang-dependency-injection skill for DI approach comparison and wiring. → See samber/cc-skills-golang@golang-lint skill for golangci-lint configuration. → See samber/cc-skills-golang@golang-continuous-integration skill for CI/CD pipeline setup. → See samber/cc-skills-golang@golang-design-patterns skill for architectural patterns.

Related skills

FAQ

What does golang-project-layout generate?

golang-project-layout generates a conventional Go directory structure plus a Makefile with build, test, lint, run, benchmark, and audit targets. It wires VERSION from git describe through LDFLAGS for services and CLI tools.

Is golang-project-layout only for CLIs?

golang-project-layout targets any new Go service or CLI tool needing clean folder layout and repeatable Make commands. Use it at repository creation before application logic grows organically.

Is Golang Project Layout safe to install?

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

Gobackenddevops

This week in AI coding

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

unsubscribe anytime.