À propos
Cette compétence structure les nouveaux projets Go avec des architectures de répertoires et des conventions adaptées à la taille du projet. Elle aide les développeurs à choisir entre des organisations plates ou des approches structurées avec des répertoires cmd/ et internal/, en couvrant la dénomination des modules et le câblage du package principal. Utilisez-la pour démarrer un nouveau module ou service Go, mais pas pour examiner des architectures existantes ou une injection de dépendances détaillée.
Installation rapide
Claude Code
Recommandénpx skills add eduardo-sl/go-agent-skills -a claude-code/plugin add https://github.com/eduardo-sl/go-agent-skillsgit clone https://github.com/eduardo-sl/go-agent-skills.git ~/.claude/skills/go-project-layoutCopiez et collez cette commande dans Claude Code pour installer cette compétence
Documentation
Go Project Layout
Structure follows size. The biggest layout mistake in Go is copying a microservice skeleton for a 500-line tool — or growing a 50-package service inside a flat directory. Match the layout to the project.
1. Pick the Layout by Project Size
| Project | Layout |
|---|---|
| Small tool, single binary, <5 files | Flat: everything in package main at the root |
| Library for others to import | Root package named after the module, internal/ for helpers |
| Service with one binary | cmd/<name>/main.go + internal/ packages |
| Multiple binaries sharing code | cmd/<name1>/, cmd/<name2>/ + internal/ |
Never start with empty pkg/, api/, docs/, build/ directories
"for later". Add structure when the code demands it, not before.
2. Module Naming
# ✅ Good — repository path, lowercase
go mod init github.com/acme/payment-service
# ❌ Bad — not fetchable, uppercase, or vanity without DNS
go mod init PaymentService
go mod init payment_service
The last path element should match what users will see: for a library, it becomes the default import name.
3. Service Layout (the default for APIs and workers)
payment-service/
├── cmd/
│ └── payment-api/
│ └── main.go # flag/env parsing, wiring, Run() — nothing else
├── internal/
│ ├── domain/ # core types, business rules; zero external deps
│ ├── service/ # use cases orchestrating domain + stores
│ ├── store/ # data access implementations (postgres/, redis/)
│ ├── handler/ # HTTP/gRPC adapters
│ └── config/ # config loading and validation
├── migrations/ # if the service owns a database
├── go.mod
├── Makefile
└── README.md
Rules:
internal/by default — the compiler enforces that nobody outside the module imports it. Promote to a public package only on demand.pkg/only when external consumers exist AND the module also has private code. When in doubt, don't create it.- Dependencies point inward:
handler → service → domain ← store.domainimports neitherstorenorhandler.
4. Thin main, Runnable Run
Keep main.go to wiring plus a delegating call, so the app is testable:
func main() {
if err := run(context.Background(), os.Args[1:], os.Getenv); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
}
func run(ctx context.Context, args []string, getenv func(string) string) error {
cfg, err := config.Load(getenv)
if err != nil {
return fmt.Errorf("load config: %w", err)
}
db, err := store.Open(ctx, cfg.DatabaseURL)
if err != nil {
return fmt.Errorf("open db: %w", err)
}
defer db.Close()
svc := service.New(store.NewUserRepo(db))
srv := handler.NewServer(cfg.Addr, svc)
return srv.ListenAndServe(ctx)
}
os.Exitappears exactly once, inmain.runtakes its dependencies (args,getenv) so tests can call it.- No
init()functions for wiring — explicit construction order only.
5. Library Layout
retry/
├── retry.go # package retry — the API, in the root
├── retry_test.go
├── backoff.go # same package, split by topic
├── internal/
│ └── clock/ # implementation details users must not import
├── examples_test.go # Example* functions shown in godoc
└── go.mod
- The root directory IS the package. No
src/, nolib/. - One package per concept. Resist
util,common,helpers— name packages after what they provide (retry,clock,httpsign).
6. Naming Rules for Directories and Packages
- Package name == directory name, short, lowercase, no underscores:
store/postgres, notstore/postgres_impl. - Don't stutter:
payment.Service, notpayment.PaymentService. - Binary names in
cmd/are user-facing:cmd/payment-api, hyphenated is fine (directory only holds packagemain).
7. Files That Belong at the Root
go.mod,go.sum,README.md,LICENSE,Makefile,.golangci.yml,Dockerfile(single-binary projects).- Do NOT create:
src/(un-idiomatic),vendor/(unless the team explicitly vendors), one-file packages liketypes/ormodels/that become dumping grounds.
Scaffolding Procedure
- Ask/decide: tool, library, or service? How many binaries?
go mod init <repo-path>.- Create only the directories the first feature needs.
- Write
main.gowith the thin-main pattern above. - Add
Makefiletargets:build,test,lint. - Verify:
go build ./...andgo vet ./...pass on the skeleton.
Verification Checklist
- Layout matches project size — no empty scaffolding directories
- Module path is the fetchable repository path
- All non-public packages live under
internal/ main.gois thin: parse, wire, callrun, exitos.Exitonly inmain; no wiring ininit()- Dependencies flow inward;
domainhas zero infrastructure imports - No
util/common/helpers/modelsgrab-bag packages - Package names match directories, lowercase, no stutter
go build ./...passes on the fresh skeleton
Dépôt GitHub
Questions fréquentes
Qu’est-ce que le Skill go-project-layout ?
go-project-layout est un Skill Claude créé par eduardo-sl. Un Skill regroupe des instructions et des ressources que Claude charge à la demande pour effectuer des tâches liées à go-project-layout sans consigne supplémentaire.
Comment installer go-project-layout ?
Utilisez les commandes d’installation de cette page : ajoutez go-project-layout à Claude Code comme plugin ou clonez son dépôt dans votre dossier skills, puis redémarrez Claude pour charger le Skill.
À quelle catégorie appartient go-project-layout ?
go-project-layout appartient à la catégorie Méta.
go-project-layout est-il gratuit ?
Oui. go-project-layout est référencé sur AIMCP et son installation est gratuite.
Compétences associées
Cette compétence propose une configuration éprouvée en production pour Content Collections, un outil axé sur TypeScript qui transforme des fichiers Markdown/MDX en collections de données typées de manière sûre avec une validation Zod. Utilisez-la lors de la création de blogs, de sites de documentation ou d'applications Vite + React riches en contenu pour garantir la sécurité de typage et la validation automatique du contenu. Elle couvre tout, de la configuration du plugin Vite et de la compilation MDX à l'optimisation des déploiements et la validation des schémas.
Cette compétence permet aux développeurs de créer des applications avec la plateforme de marchés prédictifs Polymarket, incluant l'intégration d'API pour le trading et les données de marché. Elle fournit également une diffusion de données en temps réel via WebSocket pour surveiller les transactions en direct et l'activité du marché. Utilisez-la pour mettre en œuvre des stratégies de trading ou pour créer des outils traitant les mises à jour de marché en direct.
Cette compétence aide les développeurs à créer des plugins OpenCode qui s'interconnectent avec plus de 25 types d'événements tels que les commandes, les fichiers et les opérations LSP. Elle fournit la structure du plugin, les spécifications de l'API événementielle et les modèles d'implémentation pour les modules JavaScript/TypeScript. Utilisez-la lorsque vous avez besoin d'intercepter, de surveiller ou d'étendre le cycle de vie de l'assistant IA OpenCode avec une logique personnalisée pilotée par les événements.
SGLang est un framework de service LLM haute performance spécialisé dans la génération rapide et structurée pour les workflows JSON, regex et agentiques grâce à son cache de préfixe RadixAttention. Il offre une inférence nettement plus rapide, particulièrement pour les tâches avec des préfixes répétés, ce qui le rend idéal pour les sorties complexes et structurées ainsi que les conversations multi-tours. Choisissez SGLang plutôt que des alternatives comme vLLM lorsque vous avez besoin d'un décodage contraint ou que vous construisez des applications avec un partage étendu de préfixes.
