Основные приложения для текущего проекта.
Имя директории для каждого приложения должно совпадать с именем исполняемого файла, который вы хотите собрать (например, /cmd/myapp
).
Не стоит располагать в этой директории большие объёмы кода. Если вы предполагаете дальнейшее использование кода в других проектах, вам стоит хранить его в директории /pkg
в корне проекта. Если же код не должен быть переиспользован где-то еще - ему самое место в директории /internal
в корне проекта.
Самой распространённой практикой является использование маленькой main
функции, которая импортирует и вызывает весь необходимый код из директорий /internal
и /pkg
, но не из других.
Примеры:
- https://github.com/vmware-tanzu/velero/tree/main/cmd
- https://github.com/moby/moby/tree/master/cmd
- https://github.com/prometheus/prometheus/tree/main/cmd
- https://github.com/influxdata/influxdb/tree/master/cmd
- https://github.com/kubernetes/kubernetes/tree/master/cmd
- https://github.com/dapr/dapr/tree/master/cmd
- https://github.com/ethereum/go-ethereum/tree/master/cmd
Внутренний код приложения и библиотек. Это код, который не должен использоваться в других приложениях и библиотеках. Стоит отметить, что этот шаблон применяется самим компилятором Golang. Также, вы вольны использовать более одной директории internal на разных уровнях структуры своего проекта.
Вы можете добавить дополнительное структурирование, чтобы разделить открытую и закрытую части вашего внутреннего кода. Такой подход не является обязательным (особенно для маленьких проектов), но позволяет сразу визуально оценить область применение кода. Код самого приложения может находиться в директории /internal/app
(например, /internal/app/myservice
).
Код библиотек, пригодных для использования в сторонних приложениях (например, /pkg/mypubliclib
). Другие проекты будут импортировать эти библиотеки, ожидая их автономной работы, поэтому стоит подумать дважды, прежде чем класть сюда какой-нибудь код. Обратите внимание, что использование директории internal - более оптимальный способ гарантировать что ваши внутренние пакеты, не будут импортированы, потому что это обеспечивает сам Go. Директория /pkg
- всё еще хороший путь дать понять, что код в этой директории могут безопасно использовать другие.
Спецификации OpenAPI/Swagger, JSON schema файлы, файлы определения протоколов.
- https://talks.golang.org/2014/names.slide
- https://golang.org/doc/effective_go.html#names
- https://blog.golang.org/package-names
- https://github.com/golang/go/wiki/CodeReviewComments
- Руководство по стилизации кода для пакетов Golang (rakyll/JBD)
- GopherCon EU 2018: Peter Bourgon - Best Practices for Industrial Programming
- GopherCon Russia 2018: Ashley McNamara + Brian Ketelsen - Go best practices.
- GopherCon 2017: Edward Muller - Go Anti-Patterns
- GopherCon 2018: Kat Zien - How Do You Structure Your Go Apps