Go Zero to Hero - Bài 13: Vòng lặp duy nhất trong Go: Từ khoá for
Nếu các ngôn ngữ khác bắt bạn phải nhớ đủ bộ ba từ khóa for, while, và do-while, thì Golang mang đến một sự tối giản cực đoan nhưng cực kỳ mạnh mẽ: Go chỉ sử dụng duy nhất một từ khóa for cho mọi loại vòng lặp.
1. Vòng lặp phong cách truyền thống (Classic C-style)
Đây là hình hài quen thuộc nhất của for, thường dùng khi bạn biết chính xác số lần muốn lặp lại (như một bộ đếm counter). Nó gồm 3 thành phần ngăn cách bởi dấu chấm phẩy ;.
package main
import "fmt"
func main() {
// Cú pháp: for [Khởi tạo]; [Điều kiện]; [Hành động sau mỗi lần lặp]
for i := 1; i <= 5; i++ {
fmt.Printf("Giao dịch thứ %d đang được xử lý...\n", i)
}
}
Lưu ý: Giống như
if, bạn không được dùng dấu ngoặc đơn()bao quanh các biểu thức, và dấu{phải nằm trên cùng một dòng. Biếniđược khai báo bằng toán tử:=sẽ chỉ tồn tại bên trong phạm vi của vòng lặp này.
2. Vòng lặp giả danh while (The while equivalent)
Nếu bạn bỏ đi phần Khởi tạo và Hành động, chỉ giữ lại phần Điều kiện, vòng lặp for của Go ngay lập tức "biến hình" thành vòng lặp while của các ngôn ngữ khác.
func main() {
retryCount := 3
// Trông y hệt while(retryCount > 0)
for retryCount > 0 {
fmt.Println("Đang kết nối lại tới Server...")
retryCount-- // Tự giảm biến đếm bên trong vòng lặp
}
fmt.Println("Đã kết nối thành công!")
}
Sự linh hoạt này giúp Go không cần đẻ thêm từ khóa while làm chật chội không gian bộ nhớ của trình biên dịch.
3. Vòng lặp vô tận (Infinite loop) và Ứng dụng Backend thực chiến
Nếu bạn lược bỏ luôn cả Điều kiện, bạn sẽ có một vòng lặp vô tận: for {}.
Ở các bài toán lập trình cơ bản, vòng lặp vô tận nghe có vẻ giống một "lỗi" (bug) treo máy. Nhưng trong kiến trúc Backend hiện đại, đặc biệt là các hệ thống Message Broker (RabbitMQ, Kafka) hoặc các tiến trình Daemon lắng nghe tín hiệu phần cứng (như máy chủ cổng quay AFC kiểm tra thẻ liên tục), đây là cú pháp bạn sẽ viết hàng ngày.
Nó đóng vai trò như một Background Worker hoạt động không ngừng nghỉ để kéo (poll) dữ liệu:
func startTicketWorker() {
fmt.Println("Worker hệ thống vé bắt đầu chạy...")
// Vòng lặp vô tận lắng nghe sự kiện
for {
// Hàm này sẽ giả lập việc chờ dữ liệu quẹt thẻ đẩy về từ cổng
// Khi không có dữ liệu, worker sẽ tạm ngủ (block) để không tốn CPU
ticketData := listenForTicketScan()
processTicket(ticketData)
}
}
Để thoát khỏi vòng lặp vô tận một cách có chủ đích (ví dụ khi server nhận tín hiệu shutdown), chúng ta sẽ dùng đến các công cụ điều khiển luồng.
4. Kiểm soát luồng lặp: break và continue
Giống hệt các ngôn ngữ khác, Go cung cấp 2 từ khóa mạnh mẽ để can thiệp vào tiến trình của vòng lặp:
break: Đập vỡ vòng lặp ngay lập tức và thoát ra ngoài.continue: Bỏ qua các lệnh còn lại của lần lặp hiện tại, nhảy ngay sang lần lặp tiếp theo.
for i := 1; i <= 10; i++ {
// Nếu gặp số chẵn, bỏ qua và nhảy sang số tiếp theo
if i%2 == 0 {
continue
}
// Nếu gặp số 7, coi như lỗi hệ thống, thoát vòng lặp ngay lập tức
if i == 7 {
fmt.Println("Lỗi phần cứng tại node 7. Dừng đồng bộ dữ liệu!")
break
}
fmt.Println("Đang đồng bộ dữ liệu node:", i)
}
// Kết quả in ra: 1, 3, 5. (Bỏ qua 2, 4, 6. Dừng hẳn ở 7).
5. Vòng lặp for range: Vũ khí duyệt tập hợp (Collection)
Tôi sẽ chỉ "nhá hàng" một chút về cú pháp này, vì đây là "kẻ thay thế" xuất sắc cho vòng lặp foreach. Khi bạn cần duyệt qua một danh sách (Mảng, Slice, Map) hay một kênh giao tiếp (Channel), for range là sự lựa chọn duy nhất và mạnh mẽ nhất.
// Một mảng các IP của server
serverIPs := []string{"192.168.1.10", "192.168.1.11", "192.168.1.12"}
// range trả về 2 giá trị: chỉ mục (index) và giá trị (value)
for index, ip := range serverIPs {
fmt.Printf("Server số %d có địa chỉ IP là: %s\n", index, ip)
}
Tổng kết
Bức tranh về Control Flow của bạn đã hoàn thiện. Hãy nhớ kỹ:
- Một cho tất cả: Go chỉ dùng duy nhất từ khóa
for. Không cần tìm kiếmwhilehayforeach. - Linh hoạt tối đa: Từ lặp theo bộ đếm truyền thống, lặp theo điều kiện, cho đến lặp vô hạn (chuyên dùng cho các background job lắng nghe dữ liệu liên tục).
- Điều hướng thủ công: Luôn nhớ dùng
breakvàcontinueđể tối ưu hóa vòng lặp, tránh thực thi những logic thừa thãi.
All rights reserved