Go Patterns: bộ sưu tập Go design patterns và idiom
Go Patterns đáng để lưu lại như một bảng tra cứu, không phải một cuốn sách đọc từ đầu đến cuối. Bộ sưu tập này xếp các Go design patterns vào mười nhóm và đánh dấu từng pattern bằng dấu tick hoặc dấu X, để bạn biết trước khi bấm vào xem mình sẽ nhận được một đoạn code chạy được hay chỉ là một cái tên kèm mô tả một dòng. Cột trạng thái đó chính là giá trị cốt lõi của trang này.
Go Patterns là bộ sưu tập gì?
Go Patterns là một repository trên GitHub (tmrts/go-patterns) tập hợp các design pattern và application pattern idiomatic cho Go, dưới dạng các file markdown liên kết với nhau. README nhóm các mục vào mười bảng — Creational, Structural, Behavioral, Synchronization, Concurrency, Messaging, Stability, Profiling, Idioms và Anti-Patterns — mỗi dòng gồm tên pattern, mô tả ngắn, và một dấu tick cho biết đã có code hay chưa.
Các design pattern trong Go được bộ sưu tập bao gồm
- ✓Mười nhóm pattern — creational, structural, behavioral, synchronization, concurrency, messaging, stability, profiling, idioms và anti-patterns — mỗi nhóm là một mục riêng trong README kèm bảng liên kết.
- ✓Một cột trạng thái (✔/✘) bên cạnh mỗi pattern, đánh dấu pattern nào đã có ví dụ code viết sẵn và pattern nào mới chỉ dừng ở tên gọi cùng mô tả một dòng.
- ✓Các pattern dành riêng cho concurrency mà phần lớn sách pattern hướng OOP bỏ qua hoàn toàn: Fan-In/Fan-Out, Bounded Parallelism, Generators, và một mục Reactor để demultiplex các service request.
- ✓Các stability pattern vay mượn từ thực hành hệ thống phân tán — Circuit-Breaker, Bulkheads, Deadline, Fail-Fast, Handshaking, Steady-State — áp dụng cho Go service thay vì các class pattern kiểu GoF thông thường.
- ✓Một anti-pattern duy nhất được tài liệu hoá, Cascading Failures, mô tả cách lỗi ở một thành phần lan qua các phần liên kết với nhau trong hệ thống.
- ✓Một trang idiom Functional Options — câu trả lời của Go cho việc constructor bị nạp quá nhiều tham số — được xếp riêng khỏi nhóm Creational, Structural và Behavioral kinh điển.
Khi nào nên áp dụng từng nhóm pattern
- •Chọn Singleton, Builder, hay Factory Method khi cần một cách kiểm soát để khởi tạo một type — vài creational pattern ở đây đã có code chạy được.
- •Chọn một primitive cho concurrency — Fan-Out/Fan-In cho worker pool, Bounded Parallelism để giới hạn số goroutine, Semaphore để giới hạn quyền truy cập vào một resource dùng chung.
- •Thêm khả năng chịu lỗi cho một service boundary bằng Circuit-Breaker trước khi một dependency phía sau bắt đầu timeout dưới tải cao.
- •Cấu trúc một API theo Functional Options thay vì một constructor với hàng chục tham số theo vị trí.
- •Đọc các mục chưa implement (Bridge, Mediator, Visitor, và nhiều mục khác) như tài liệu tham khảo dù chưa có code, vì cột mô tả vẫn giải thích được ý tưởng.
Điểm mạnh
- ✓Mỗi danh sách pattern là một bảng có thể bấm vào — nhóm, tên, mô tả một dòng, và trạng thái — nên quét qua toàn bộ taxonomy chỉ mất một màn hình thay vì một vòng tìm-rồi-bấm.
- ✓Nhóm các pattern mà kỹ sư Go thực sự dùng lúc runtime — Semaphore, Circuit-Breaker, Fan-In/Fan-Out — dưới những heading mà một cuốn sách Gang of Four chưa bao giờ dùng, nằm cạnh bộ Creational/Structural/Behavioral kinh điển.
- ✓Các mục đã implement dẫn thẳng tới một bài viết mang màu sắc Go, thay vì một ví dụ pseudocode chung chung.
- ✓Cấp phép theo Apache-2.0, nên việc lấy phần giải thích của một pattern hay chỉnh sửa ví dụ code cho dự án riêng hoặc wiki nội bộ không phải là một câu hỏi về giấy phép.
Những gì bộ sưu tập không bao gồm
- △Hơn một nửa số pattern trong catalog được đánh dấu ✘ — chỉ có tên, một mô tả một dòng, và một file markdown liên kết mà bên trong không có code Go nào.
- △README không có changelog hay ngày tháng nào trong toàn bộ nguồn, nên không có cách nào biết một trang pattern cụ thể được cập nhật gần đây hay không.
- △Các mục là những file markdown rời rạc theo từng pattern, không phải một mạch nội dung liền — không có chương nào so sánh các pattern với nhau hay giải thích khi nào nên chọn nhóm này thay vì nhóm kia.
- △Mục Anti-Patterns chỉ có đúng một mục, Cascading Failures, nên đây không phải một catalog đầy đủ về những sai lầm thường gặp khi viết Go.
Các nguồn tài liệu Go design pattern khác
Câu hỏi thường gặp
Go Patterns tổng hợp 48 mục pattern và idiom, chia vào mười nhóm: Creational, Structural, Behavioral, Synchronization, Concurrency, Messaging, Stability, Profiling, Idioms và Anti-Patterns. Mỗi nhóm có một bảng riêng trong README, mỗi dòng liên kết tới một trang markdown ngắn cho pattern đó.
Trong 48 mục của Go Patterns, 18 mục được đánh dấu tick cho thấy đã có ví dụ code Go viết sẵn. 30 mục còn lại chỉ liệt kê tên và một mô tả một dòng trong bảng, trang markdown liên kết chưa có code mẫu nào.
Go Patterns chia toàn bộ catalog thành mười nhóm: Creational, Structural, Behavioral, Synchronization, Concurrency, Messaging, Stability, Profiling, Idioms và Anti-Patterns. Mỗi nhóm xuất hiện như một bảng riêng trong README, liệt kê tên pattern, mô tả một dòng, và việc đã có ví dụ code Go hay chưa.
README của Go Patterns không công bố changelog hay ngày commit cho từng pattern, nên không thể xác nhận mức độ cập nhật gần đây từ chính tài liệu của bộ sưu tập. Điều ổn định là cấu trúc nhóm và danh sách pattern, vốn đóng vai trò một tài liệu tham khảo bất kể nhịp độ cập nhật.
Trong Go Patterns, các Synchronization pattern — Mutex, Semaphore, Read-Write Lock, Condition Variable — kiểm soát quyền truy cập độc quyền hoặc chia sẻ vào một resource duy nhất. Các Concurrency pattern — Bounded Parallelism, Generators, Parallelism, Producer Consumer — tổ chức cách các task độc lập được chia nhỏ và chạy, chứ không phải cách chúng chia sẻ resource.
Go Patterns tài liệu hoá đúng một anti-pattern: Cascading Failures, xếp trong nhóm Anti-Patterns riêng. README mô tả đây là lỗi trong một hệ thống gồm nhiều phần liên kết với nhau, khi một thành phần lỗi kéo theo hiệu ứng domino lan ra toàn hệ thống.
Nên dùng cho ai — và ai nên bỏ qua
Dùng cái này nếu bạn đã viết Go và cần một cái tên cùng một định nghĩa ngắn cho thứ sắp xây dựng — một worker pool, một circuit breaker, một constructor kiểu functional options — cộng thêm một ví dụ liên kết khi có sẵn. Bỏ qua nếu bạn mới học Go: bộ sưu tập này giả định bạn đã đọc hiểu goroutine, channel và interface một cách thoải mái, và nó sẽ không dạy bạn ngôn ngữ từ đầu. Cũng nên bỏ qua nếu bạn muốn một mạch nội dung duy nhất lập luận vì sao nên chọn pattern này thay vì pattern kia — đây là một bảng tra cứu, không phải một cuốn giáo trình thiết kế.
Repo liên quan
Muốn nghe thêm một ý kiến về go-patterns?
Hỏi một AI đọc được trang này — một cú bấm là có ngay nhận định về go-patterns.
