Select
🧠 1. select
trong Go là gì?
select
trong Go là gì?Trong Go, select
được dùng để chọn một case có thể thực thi từ nhiều channel. Nó hoạt động giống như switch
, nhưng dành riêng cho channel operations (send/receive).
Cú pháp:
🚀 2. Cách select
hoạt động (theo chiều sâu)
select
hoạt động (theo chiều sâu)select
sẽ chờ cho đến khi có ít nhất một case sẵn sàng (có thể gửi hoặc nhận).Nếu nhiều case sẵn sàng cùng lúc → Go runtime sẽ chọn ngẫu nhiên một case.
Nếu không có case nào sẵn sàng và không có
default
→select
block.Nếu có
default
,select
không block và thực hiện luôndefault
.
🔧 3. Ứng dụng thực tế
✅ Ví dụ 1: Timeout cho channel
👉 Đây là cách thường dùng để tránh deadlock khi chờ channel quá lâu.
✅ Ví dụ 2: Multiplexing nhiều channel
👉 Cách thường dùng để nghe nhiều nguồn dữ liệu bất đồng bộ cùng lúc.
⚠️ 4. Những lỗi phổ biến khi dùng select
select
❌ Không đóng channel → memory leak
Nếu không close(ch)
đúng lúc → goroutine này sẽ bị block mãi mãi trong range
, gây leak.
❌ Không có default nhưng tất cả case đều block
Giải pháp:
Thêm
default
Đảm bảo ít nhất một case có thể sẵn sàng
🧩 5. Một số tips nâng cao
✴️ Dùng với context.Context
để cancel goroutine
context.Context
để cancel goroutine👉 Cách chuẩn để dọn dẹp goroutine khi cần cancel (ví dụ hết thời gian, client disconnect, etc.)
✴️ Loop với select và time.Ticker (polling)
👉 Rất hữu ích trong worker pool, background task, job scheduler...
🔚 Tổng kết
select
Dùng để xử lý nhiều channel cùng lúc
Non-blocking
Thêm default
để tránh block
Timeout
Kết hợp với time.After
Cancel
Kết hợp với context.Context
Leak
Nhớ đóng channel hoặc handle cancel properly
Last updated