Hướng dẫn thực hành tốt nhất về 3 cấu trúc thư mục dự án Go

Nội dung bài viết

Video học lập trình mỗi ngày

Phát triển dự án với ngôn ngữ nào cũng vậy không riêng về Go, thì khi một câu trúc đưa ra bởi một TEAM thì tôi thấy thường có đóng vài trò then chốt trong việc mở rộng cũng như bảo trì và quan trọng là anh em vui vẻ làm việc. Chỉ cần vài lệnh CLI là có thể test, run, build or nếu có Bug thì khoanh vùng rất dễ. Vì vậy bài viết này tôi sẽ đề cập đến 4 cấu trúc mà chúng tôi thường sử dụng với các dự án khác nhau tuỳ theo nhà cái :v

Go: Backend Architect là dự án phát triển của Member, build từ góc độ của lập trình viên tập làm quen và đến khi thành thạo.

Ngoài: Trong Series - Nodejs Architect thì đã tích hợp làm quen với Aws và RabbitMQ các bạn nhớ đừng để miss. Section 64: Amazon Web Service (AWS) Intro vs Regis...

Project Structure and Architecture

Nếu nói về Go thì có trên github có một git nói về cấu trúc dạng chuẩn của Go. Cộng đồng xem đó là kim chỉ nam cho việc phát triển thư mục ngay bước đầu tiên.

Cấu trúc dự án API REST từ lv1 đến lv4 | APIStructure Your Nodejs REST API for beginner to Advanced

Và nó cũng gây tranh cãi, ngoài ra cũng không hẳn là các công ty lấy đó làm chuẩn để bắt đầu xây dựng một dự án, nếu bạn quan tâm thì có thể xem và tìm hiểu các folder tại bài viết này: GO Fresher (01): Giới thiệu những cấu trúc dự án Backend Project Structure

Tiếp theo thì dựa trên các CheckList thì sẽ có hai Project Structure truyền thống và khá phổ biến đó chính là hai cấu trúc dưới đây, bạn có thể xem xét nó.

myproject/
├── cmd/
│   └── server/
│       └── main.go
├── internal/
│   ├── handler/
│   │   └── user.go
│   ├── model/
│   │   └── user.go
│   └── service/
│       └── user.go
├── pkg/
│   └── logger/
│       └── logger.go
├── api/
│   └── openapi.yaml
├── configs/
│   └── config.yaml
├── deployments/
│   └── docker-compose.yaml
├── scripts/
│   └── build.sh
├── go.mod
├── go.sum
└── README.md

cấu trúc thứ hai đó là: (GO Fresher(27): Tôi tự BUILD 3 Project Structure và từ Fresher Up To Senior. Share lại cho ANH EM). Có dạng như sau:

➜  go-drunk-backend-api tree
.
├── Dockerfile
├── Makefile
├── README.md
├── build.sh
├── cmd
│   └── drunk
│       └── main.go
├── environment
├── global
├── go.mod
├── go.sum
├── init.sql
├── internal
│   ├── common
│   ├── config
│   ├── controller
│   │   ├── auth
│   │   │   ├── auth.controller.go
│   │   │   └── dto
│   │   │       └── auth.dto.go
│   │   └── user
│   ├── initialize
│   │   ├── mysql.go
│   │   ├── router.go
│   │   ├── run.go
│   │   └── service.go
│   ├── middleware
│   │   ├── cors.go
│   │   └── validation.go
│   ├── model
│   │   ├── auth
│   │   │   └── auth.entity.go
│   │   └── user
│   ├── repository
│   │   ├── auth
│   │   │   └── auth.repository.go
│   │   ├── repositories.go
│   │   └── user
│   │       └── user.repository.go
│   ├── router
│   │   ├── auth
│   │   │   ├── auth.router.go
│   │   │   ├── enter.go
│   │   │   └── rbac.router.go
│   │   ├── enter.go
│   │   └── user
│   │       └── enter.go
│   └── service
│       ├── auth
│       │   ├── auth.service.go
│       │   └── auth.service.impl.go
│       └── user
├── pkg
│   └── response
│       ├── codeErr.go
│       └── response.go
├── scripts
├── tests
└── utils
    ├── cache.go
    └── validator.go

Các bạn cũng có thể lấy Source và Run nó nếu có thể tại đây: Source Go Project.

Ngoài ra tôi không khuyên các bạn sử dụng thư mục src như trong JAVA đã làm. Vì khi install golang thì đã có một thư mục src trong đó, nên dễ nhầm cách build. Ví dụ, KHÔNG NÊN.

# src: project
/src  ❌
main.go  ❌ 
server.go ❌
handler.go ❌

Domain-Driven Design (DDD)

Nói đến DDD thì các lập trình viên thường nghĩ ngay là à đó là phẩn thưởng dành cho anh em lập trình JAVA. Và cụm từ Domain-Driven Design (DDD) có phải là thần thánh quá không, hay ai đã đẩy ngôn từ đó phức tạp đến vậy thì chưa kết thúc tranh cãi.

Bỏ qua chuyện đó, DDD những ai đã triển khai rồi thì có lẽ họ có chính kiến riêng của họ. Ví dụ như tôi cũng xây dựng một Open Source về dự án DDD - bán vé tàu tết]() sử dụng JAVA - Springboot. Với thư mục như sau:

Các bạn MEMBER đã nói rằng: Rất tuyệt đúng không! Bạn cũng có thể lấy Source về tại đây: JAVA DDD Source Code: Bán Vé Từ Video Section 17 - 26 How to run()

Vậy còn Go có thể triển khai DDD được không? Rõ ràng là được, tuy không bắt buộc nhưng hãy thử run nó theo style của JAVA. Và đây là thư mục...

➜  go-drunk-backend-api-by-ddd-java tree
.
├── Dockerfile
├── Makefile
├── README.md
├── build.sh
├── cmd
│   ├── drunk
│   │   └── main.go
│   └── swag
│       └── docs
│           ├── docs.go
│           ├── swagger.json
│           └── swagger.yaml
├── environment
├── global
├── go.mod
├── go.sum
├── init.sql
├── internal
│   ├── auth
│   │   ├── application
│   │   │   ├── schedule
│   │   │   └── service
│   │   │       ├── auth.service.go
│   │   │       ├── auth.service.impl.go
│   │   │       └── dto
│   │   │           └── account.app.dto.go
│   │   ├── controller
│   │   │   ├── dto
│   │   │   │   └── account.dto.go
│   │   │   ├── http
│   │   │   │   ├── auth.handler.go
│   │   │   │   └── auth.router.go
│   │   │   └── rgpc
│   │   ├── domain
│   │   │   ├── model
│   │   │   │   └── entity
│   │   │   │       └── account.go
│   │   │   └── repository
│   │   │       └── auth.repository.go
│   │   └── infrastructure
│   │       ├── cache
│   │       ├── config
│   │       └── persistence
│   │           └── repository
│   │               └── auth.repository.go
│   ├── common
│   │   └── const
│   │       └── consts.go
│   ├── feed
│   │   ├── application
│   │   │   ├── schedule
│   │   │   └── service
│   │   │       ├── dto
│   │   │       │   └── feed.dto.go
│   │   │       ├── feed.service.go
│   │   │       └── feed.service.impl.go
│   │   ├── controller
│   │   │   ├── dto
│   │   │   │   └── feed.dto.go
│   │   │   ├── http
│   │   │   │   ├── feed.handler.go
│   │   │   │   └── feed.router.go
│   │   │   └── rgpc
│   │   ├── domain
│   │   │   ├── dto
│   │   │   │   └── feed.dto.go
│   │   │   ├── model
│   │   │   │   └── entity
│   │   │   │       └── feed.go
│   │   │   └── repository
│   │   │       └── feed.repository.go
│   │   └── infrastructure
│   │       ├── cache
│   │       ├── config
│   │       └── persistence
│   │           └── repository
│   │               └── feed.repository.go
│   ├── initialize
│   │   ├── auth
│   │   │   └── service.go
│   │   ├── config.go
│   │   ├── feed
│   │   │   └── service.go
│   │   ├── mysql.go
│   │   ├── router.go
│   │   ├── run.go
│   │   └── user
│   │       └── service.go
│   ├── middleware
│   │   ├── cors.go
│   │   ├── guards.go
│   │   ├── jwtAuth.go
│   │   └── validation.go
│   └── user
│       ├── application
│       │   ├── schedule
│       │   └── service
│       │       ├── follow.service.go
│       │       ├── follow.service.impl.go
│       │       ├── user.service.go
│       │       └── user.service.impl.go
│       ├── controller
│       │   ├── dto
│       │   │   ├── follow.dto.go
│       │   │   └── user.dto.go
│       │   ├── http
│       │   │   ├── user.handler.go
│       │   │   └── user.router.go
│       │   └── rgpc
│       ├── domain
│       │   ├── model
│       │   │   └── entity
│       │   │       ├── follower.go
│       │   │       └── user.go
│       │   └── repository
│       │       ├── follower.repository.go
│       │       └── user.repository.go
│       └── infrastructure
│           ├── cache
│           ├── config
│           └── persistence
│               ├── mapper
│               │   └── follower.go
│               └── repository
│                   ├── follower.repository.go
│                   └── user.repository.go
├── pkg
│   ├── response
│   │   ├── codeErr.go
│   │   └── response.go
│   └── security
│       └── jwt.go
├── scripts
├── temp.go
├── tests
└── utils
    ├── cache.go
    └── validator.go

Bạn cũng có thể lấy Source về tại đây: GO FRESHER (28): Tái thiết cấu trúc CODE từ MVC qua DDD Project (Source MVC - FEAT)

Tôi biết, có bạn sẽ đóng ngay bài viết này trong 2 giây. Đơn giản là tôi đặt vào hoàn cảnh đó nếu không chưa thực sự danh thời gian để tìm hiểu thì tôi cũng bỏ qua nó.

Ngược lại, có những bạn rất chăm chú và tiếp tục tìm hiểu nó đến cùng.

Hoan nghênh các bạn đến với nhà tôi.

Có thể bạn đã bị missing