организуйте свой проект golang, а также свой код
В своей последней статье я создал неорганизованный сервис, предназначенный только для новичков. Моим мотивом было предоставить базовую концепцию создания службы REST и продвигаться вперед шаг за шагом.
Если вы не знакомы с моим предыдущим постом, вы можете перейти по ссылке ниже, чтобы понять функциональность. Нетрудно проверить взглядом, или, если у вас есть предыдущие знания о создании службы веб-API, вас могут обработать.
В этом уроке я покажу, как организовать проект. Организация вашего кода важна, потому что, когда вы хотите изменить некоторую логику своего предыдущего кода, хорошо структурированный проект может легко принять изменения, а также сэкономить время. Хотя есть противоречивые мнения о структурировании проекта, и я предпочитаю структуру из 4 слоев. Отсюда вы можете заменить или изменить что угодно.
project/ model/ repository/ handler/ driver/ main.go
модели
Этот слой будет хранить всю структуру нашей модели и используется всеми остальными слоями. Теперь переместим нашу post
структуру модели в файл models / post.go. Если у нас есть другая модель, например author
, то эта модель также будет включена в этот слой. Мы также добавили файл error.go.
error.go содержит вашу недавно созданную ошибку. Подробности можно узнать здесь.
хранилище
Репозиторий отвечает за работу, связанную с базой данных, такую как запросы, вставку / хранение или удаление. Здесь не реализована бизнес-логика.
Здесь я создаю repository.go внутри папки репозитория. Этот файл должен содержать весь интерфейс, связанный с вашим репозиторием. Если у нас есть дополнительный домен, например автор или что-то в этом роде, то сюда включается весь метод автора в интерфейсе.
Если вы заметили левую часть изображения выше, я создал папку с именем post. Мы реализуем наш интерфейс в post/post_mysql.go
файле. Почему суффикс MySQL? Потому что, если у нас есть другая база данных для репозитория сообщений, например mongo или redis, мы включим post_mongo.go (как вы ни называете) и реализуем запросы, связанные с mongo.
post_mysql.go должен удовлетворять интерфейсу PostRepo. Если мы хотим добавить какой-либо дополнительный метод, мы должны включить его в интерфейс и реализовать в файле post_mysql.go.
обработчик
В основном папка обработчика может быть конфиденциальной для репозитория, поскольку этот уровень решает, какой уровень репозитория будет использовать. Здесь обрабатывается любой процесс. Этот уровень принимает запрос, вызывает уровень репозитория, удовлетворяет бизнес-процесс и отправляет ответ.
Уровень обработчика также содержит несколько реализаций протоколов, таких как RPC, REST и т. Д., Которые изолированы другой папкой.
Водитель
В нашей структуре уровень драйвера описывается всеми нашими подключениями к базе данных. Этот уровень отвечает за соединение с базой данных и отправку объекта соединения контроллеру.
Здесь мы будем использовать main.go вместо контроллера, поскольку наша служба имеет только один домен с операциями CRUD.
На сайте main.go мы предоставим все учетные данные и подключимся к базе данных. Мы читаем наши учетные данные БД в переменной среды, которая указана в файле docker-compose. Мы также держим здесь весь наш маршрут, но вы можете его изолировать.
Примеры проектов
Вы можете ознакомиться с образцом проекта здесь
https://github.com/s1s1ty/go-mysql-crud
Я также рекомендую вам добавить тестовый файл. Опять же, любой дизайн не похож на Библию, мы должны реализовать его в соответствии с нашим определением проекта, бизнес-логикой и т. Д.
В заключение
Вы можете узнать больше об этой теме по ссылкам ниже.
- Https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html
- Http://blog.ralch.com/tutorial/design-patterns/golang-design-patterns/
- Https://hackernoon.com/golang-clean-archithecture-efd6d7c43047
- Можете посмотреть видео дяди Боба, смешно.
Все, что связано с этим постом, вы можете задать мне в разделе комментариев или linkedin.
Наконец, вы можете застрелить меня в разделе комментариев ниже, если заметите какую-либо ошибку, которую я сделал. Вы также можете прислать мне PR в моем репозитории GitHub.