Posts

Showing posts from July, 2025

Tạm biệt Boris

Boris đưa cho tôi cái USB xong thì bác đi rót cho tôi cốc nước lọc. Bác hỏi tôi uống Coca không, tôi bảo chỉ cần nước thôi, bác lại hỏi mày có uống đá không, tôi bảo không. Tôi ngồi xuống cắm cái USB vào máy, USB bị một con virus set lại thuộc tính tất cả các thư mục và làm chúng ẩn hết đi. Tôi gõ một câu lệnh cmd ngắn rồi ngồi đợi. Boris ngồi xuống, duỗi hai chân một cách thoải mái. Bác ngáp một cái mỗi khi nói xong môt câu dài hoặc hai câu ngắn. Nhịp độ là thế. Nhìn rất chán đời. Bác giải thích do đêm qua về muộn, sáng phải đi gặp nha sỹ và đưa con mèo đi phòng khám từ sớm nên thiếu ngủ thôi.  Tôi kể cho bác về tình hình của tôi, của cơ quan cũ rồi nhiều chuyện khác. Bác vẫn như mọi lần, bắt đầu nói thì không ngừng được. Tôi nghe chăm chú vì cảm thấy sau này sẽ không còn dịp nào nữa. Tuần sau bác sẽ bay nửa vòng trái đất về đảo của bác. Tôi bắt đầu hình dung một ông già tóc trắng, dáng đậm ngồi dọc bờ biển nhìn xa xăm mỗi chiều rồi. Tôi hỏi bác có kế hoạch gì ở đó không, bác bả...

(GO) Một vài lưu ý

 1. Denpendency Injection Khi phân tầng, Handler gọi xuống tầng Usecase qua một hàm, tạm gọi GetUser, tại tầng này GetUser gọi xuống Repo/Storage thông qua Contructor của một struct đã inject  Interface X. Dĩ nhiên X chứa phương thức xử lý dữ liệu cho tầng Repo. Tầng business có thể gọi Repo thông qua biz.store.GetUser(). Lúc này Go sẽ tìm có method nào đã implement đúng phương thức của interface X trùng tên, trùng chữ ký và thực hiện nó.  2. Hàm trả về hàm Là closure. Ứng dụng trong viết Handler, Middleware ... Khi có Request gửi đến, GIN/ECHO... gọi hàm xử lý, ví dụ func (ctx *gin.Context) . Hàm này không thể truyền DB vào được, nên viết handler dưới dạng Closure để truyền DB. Việc giữ được trạng thái riêng của Closure giúp cho router có thể tạo riêng handler có nhiều DB khác nhau mà không ảnh hưởng. Tương tự với việc xử lý channel trong Routine và tùy biến Middleware. 3. Hàm nhận và trả về Interface. a. Hàm nhận vào 1 Interface: Hàm nhận vào interface thì nó nhận vào...

(GOLANG) REST API theo kiến trúc Clean Architecture

Image
 ┌────────────────────────────────────────┐ │             Framework (Gin)           │ ◄── handler / transport └────────────────────────────────────────┘                 │                 ▼ ┌────────────────────────────────────────┐ │       Use Case / Business Rules        │ ◄── biz └────────────────────────────────────────┘                 │                 ▼ ┌────────────────────────────────────────┐ │         Interface Adapters (DB)        │ ◄── storage └────────────────────────────────────────┘                 │                 ▼ ┌────────────────────────────────────────┐ │      ...