𝗕𝘂𝗶𝗹𝗱𝗶𝗻𝗴 𝗠𝘆 𝗙𝗶𝗿𝘀𝘁 𝗥𝗲𝗮𝗹 𝗔𝗣𝗜 𝗶𝗻 𝗚𝗼 𝘄𝗶𝘁𝗵 𝗚𝗶𝗻

Tôi đang chuyển từ lý thuyết sang thực hành.

Sau khi nghiên cứu về struct, interface, goroutine và xử lý lỗi, tôi đã xây dựng một Orders API hoạt động được bằng Go và framework Gin.

API thực hiện ba tác vụ:

  • Tạo một đơn hàng
  • Lấy một đơn hàng theo ID
  • Liệt kê tất cả các đơn hàng

Tôi chọn Gin vì nó đơn giản hóa việc định tuyến (routing) và middleware. Nó cung cấp các hàm hỗ trợ như c.JSONc.AbortWithStatusJSON. Những công cụ này giúp loại bỏ các đoạn mã lặp đi lặp lại.

Cấu trúc dự án: Tôi sử dụng bố cục package phẳng để giữ cho mọi thứ gọn gàng:

  • handler: Quản lý logic HTTP.
  • model: Định nghĩa cấu trúc dữ liệu.
  • store: Xử lý lưu trữ dữ liệu.
  • middleware: Quản lý logging và các yêu cầu (requests).

Các lựa chọn kỹ thuật chính:

• Xác thực dữ liệu (Data Validation) Tôi đã sử dụng struct tags để tuần tự hóa JSON (JSON serialization). Tôi cũng sử dụng các Gin binding tags. Điều này đảm bảo rằng các trường bắt buộc luôn tồn tại và các giá trị phải lớn hơn không.

• Lưu trữ và Đồng thời (Persistence and Concurrency) Phiên bản hiện tại sử dụng một in-memory store. Tôi đã sử dụng sync.RWMutex để quản lý truy cập đồng thời. Điều này cho phép đọc nhiều luồng cùng lúc nhưng vẫn đảm bảo an toàn khi ghi dữ liệu.

• Interface Handler phụ thuộc vào interface OrderStore. Nó không quan tâm dữ liệu nằm trong bộ nhớ hay trong cơ sở dữ liệu. Điều này giúp việc thay đổi lớp lưu trữ (storage layer) trở nên dễ dàng.

• Xử lý lỗi (Error Handling) Tôi đã sử dụng errors.Is để kiểm tra các lỗi cụ thể như ErrNotFound. Điều này cho phép API trả về mã trạng thái 404 chính xác cho người dùng.

• Middleware Tôi đã xây dựng một logger tùy chỉnh. Nó theo dõi method, path, mã trạng thái (status code) và thời gian thực hiện yêu cầu (request duration).

Thiết lập này kết hợp tất cả những gì đã học ở các phần trước. Đây là một nền tảng có tính chức năng, có cấu trúc và có khả năng mở rộng.

Bạn cấu trúc các dự án Go của mình như thế nào? Bạn thích các package phẳng hay phân cấp sâu theo hướng domain-driven?

Nguồn: https://dev.to/mihirmohapatra/building-my-first-real-api-in-go-with-gin-3kio