What is the standard project layout for a Go application?
Aug 02, 2025 pm 02:31 PMThe answer is: Go applications do not have a mandatory project layout, but the community generally adopts a standard structure to improve maintainability and scalability. 1. cmd/ stores the program entrance, and each subdirectory corresponds to an executable file, such as cmd/myapp/main.go; 2. internal/ stores private code, cannot be imported by external modules, and is used to encapsulate business logic and services; 3. pkg/ stores publicly reusable libraries for importing other projects; 4. API/ is optional, and stores API definition files such as OpenAPI and Protobuf; 5. config/, scripts/, and web/ store configuration files, scripts and web resources respectively; 6. The root directory contains go.mod and go.sum management dependencies, as well as project metafiles such as README.md and Makefiles. This structure is suitable for medium and large projects or multi-command applications, and small tools can start with simple structures and evolve with requirements. This layout is widely adopted by Uber, Kubernetes, etc. The core principle is to clearly separate the focus, protect internal code, support reuse, and ultimately realize the maintainability and sustainable expansion of the code.
There isn't one single enforced project layout for Go applications—Go itself doesn't require a specific directory structure. However, the community has converged on a de facto standard that promotes clarity, scalability, and tool compatibility, especially as your project grows beyond a simple command-line tool.

Here's a widely accepted and practical layout for a typical Go application:
myapp/ ├── cmd/ │ └── myapp/ │ └── main.go ├── internal/ │ ├── service/ │ └── processor.go │ └── util/ │ └── helpers.go ├── pkg/ │ └── publicapi/ │ └── client.go ├── pkg/ ├── internal/ ├── cmd/ ├── api/ │ └── openapi.yaml ├── config/ │ └── config.yaml ├── scripts/ │ └── deploy.sh ├── web/ │ ├── static/ │ └── templates/ ├── go.mod ├── go.sum ├── README.md └── Makefile
Let's break down the key directories and their purpose:

1. cmd/
– Entry points for your application
Each subdirectory under cmd/
represents a separate executable.
For example:
-
cmd/myapp/main.go
→ builds themyapp
binary -
cmd/myadmin/main.go
→ builds an admin tool
Each main.go
should be minimal—just enough to wire up dependencies and start the app.

2. internal/
– Private application logic
Code here is not important by external modules (thanks to Go's internal
package rule). Use this for:
- Business logic
- Application services
- Utilities not meant for reuse outside
Structure it by domain or layer:
Internal/ ├── auth/ ├── user/ ├── database/ └── middleware/
3. pkg/
– Public libraries for external use
If parts of your code are meant to be imported by other projects, put them here.
For example:
- API clients
- Shared utilities
- Reusable components
Keep in mind: only put code here if you intend it to be stable and publicly supported.
4. api/
– API definitions (optional)
Store OpenAPI/Swagger specs, protobuf files, or GraphQL schemas here. Useful for documenting and generating client/server code.
5. config/
, scripts/
, web/
, etc.
These are self-explanatory but commonly used:
-
config/
– Configuration files (YAML, JSON, etc.) -
scripts/
– Deployment, setup, or automation scripts -
web/
– Static assets or templates (if building a web app)
6. go.mod
and go.sum
These should be in the root. They define your module and its dependencies.
module github.com/yourname/myapp go 1.21
When to use this layout?
- ? You're building a medium to large application
- ? You have multiple binaries (
cmd/
) - ? You want to separate internal vs. public code
- ? You plan to reuse components or expose libraries
For small tools or simple services , this might be overkill. A flat structure with just main.go
and go.mod
is totally fine initially.
Popular references
While not officially mandated, this layout aligns with guidance from:
- Uber's Go Style Guide
- Go Pro Tips
- Real-world projects like Kubernetes, Terraform, and Grafana
In short: start simple, evolve towards this structure as your app grows . The key ideas—separating cmd
, protecting internal
, and organizing by concern—are what matter most.
Basically, keep it clean, logical, and scalable.
The above is the detailed content of What is the standard project layout for a Go application?. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undress AI Tool
Undress images for free

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Go's switch statement will not be executed throughout the process by default and will automatically exit after matching the first condition. 1. Switch starts with a keyword and can carry one or no value; 2. Case matches from top to bottom in order, only the first match is run; 3. Multiple conditions can be listed by commas to match the same case; 4. There is no need to manually add break, but can be forced through; 5.default is used for unmatched cases, usually placed at the end.

AruneinGoisaUnicodecodepointrepresentedasanint32,usedtocorrectlyhandleinternationalcharacters;1.Userunesinsteadofbytestoavoidsplittingmulti-byteUnicodecharacters;2.Loopoverstringswithrangetogetrunes,notbytes;3.Convertastringto[]runetosafelymanipulate

Using bufio.Scanner is the most common and efficient method in Go to read files line by line, and is suitable for handling scenarios such as large files, log parsing or configuration files. 1. Open the file using os.Open and make sure to close the file via deferfile.Close(). 2. Create a scanner instance through bufio.NewScanner. 3. Call scanner.Scan() in the for loop to read line by line until false is returned to indicate that the end of the file is reached or an error occurs. 4. Use scanner.Text() to get the current line content (excluding newline characters). 5. Check scanner.Err() after the loop is over to catch possible read errors. This method has memory effect

The answer is: Go applications do not have a mandatory project layout, but the community generally adopts a standard structure to improve maintainability and scalability. 1.cmd/ stores the program entrance, each subdirectory corresponds to an executable file, such as cmd/myapp/main.go; 2.internal/ stores private code, cannot be imported by external modules, and is used to encapsulate business logic and services; 3.pkg/ stores publicly reusable libraries for importing other projects; 4.api/ optionally stores OpenAPI, Protobuf and other API definition files; 5.config/, scripts/, and web/ store configuration files, scripts and web resources respectively; 6. The root directory contains go.mod and go.sum

To import local packages correctly, you need to use the Go module and follow the principle of matching directory structure with import paths. 1. Use gomodinit to initialize the module, such as gomodinitexample.com/myproject; 2. Place the local package in a subdirectory, such as mypkg/utils.go, and the package is declared as packagemypkg; 3. Import it in main.go through the full module path, such as import "example.com/myproject/mypkg"; 4. Avoid relative import, path mismatch or naming conflicts; 5. Use replace directive for packages outside the module. Just make sure the module is initialized

Routing in Go applications depends on project complexity. 1. The standard library net/httpServeMux is suitable for simple applications, without external dependencies and is lightweight, but does not support URL parameters and advanced matching; 2. Third-party routers such as Chi provide middleware, path parameters and nested routing, which is suitable for modular design; 3. Gin has excellent performance, built-in JSON processing and rich functions, which is suitable for APIs and microservices. It should be selected based on whether flexibility, performance or functional integration is required. Small projects use standard libraries, medium and large projects recommend Chi or Gin, and finally achieve smooth expansion from simple to complex.

BuildconstraintsinGoarecommentslike//go:buildthatcontrolfileinclusionduringcompilationbasedonconditionssuchasOS,architecture,orcustomtags.2.TheyareplacedbeforethepackagedeclarationwithablanklineinbetweenandsupportBooleanoperatorslike&&,||,and

Go's flag package can easily parse command line parameters. 1. Use flag.Type() to define type flags such as strings, integers, and booleans; 2. You can parse flags to variables through flag.TypeVar() to avoid pointer operations; 3. After calling flag.Parse(), use flag.Args() to obtain subsequent positional parameters; 4. Implementing the flag.Value interface can support custom types to meet most simple CLI requirements. Complex scenarios can be replaced by spf13/cobra library.
