Thoát khỏi vòng lặp lồng nhau
Thuộc phần Logic và luồng điều khiển trong hành trình GO của Coddy. Bài học 2 trên 68.
Khi làm việc với các vòng lặp lồng nhau, câu lệnh break thông thường chỉ thoát khỏi vòng lặp trong cùng. Tuy nhiên, Go cung cấp nhãn cho phép bạn thoát trực tiếp khỏi các vòng lặp bên ngoài, giúp bạn kiểm soát chính xác các cấu trúc vòng lặp phức tạp.
Nhãn là một mã định danh theo sau bởi dấu hai chấm, được đặt trước vòng lặp. Sau đó, bạn có thể dùng break theo sau là tên nhãn để thoát khỏi vòng lặp cụ thể đó, ngay cả khi đang ở bên trong các vòng lặp lồng nhau.
outer:
for i := 0; i < 3; i++ {
for j := 0; j < 3; j++ {
if i == 1 && j == 1 {
break outer
}
fmt.Printf("i=%d, j=%d\n", i, j)
}
}Trong ví dụ này, khi điều kiện i == 1 && j == 1 được thỏa mãn, break outer thoát khỏi cả vòng lặp bên trong và bên ngoài ngay lập tức. Cách này đặc biệt hữu ích khi tìm kiếm trong các cấu trúc dữ liệu 2D và bạn muốn dừng hẳn việc tìm kiếm ngay khi tìm thấy thứ mình cần.
Thử thách
DễTrong thử thách này, bạn sẽ luyện tập cách dùng câu lệnh break có nhãn để thoát khỏi các vòng lặp lồng nhau khi tìm kiếm trong một lưới 2D. Bạn cần tìm một số mục tiêu cụ thể trong lưới và dừng tìm kiếm ngay khi tìm thấy.
Bạn sẽ nhận được hai đầu vào:
- Một chuỗi biểu thị kích thước của lưới theo định dạng
"rows,cols"(ví dụ:"3,4") - Một chuỗi biểu thị số mục tiêu cần tìm (ví dụ:
"7")
Bạn được cung cấp lưới số 2D sau:
grid := [][]int{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
}Nhiệm vụ của bạn là:
- Phân tích kích thước từ đầu vào thứ nhất để xác định số hàng và số cột cần tìm kiếm
- Phân tích số mục tiêu từ đầu vào thứ hai
- Dùng các vòng lặp lồng nhau với câu lệnh
breakcó nhãn để tìm kiếm trong lưới - Khi tìm thấy số mục tiêu, in ra
"Found [target] at position ([row], [col])"và lập tức thoát khỏi cả hai vòng lặp bằng câu lệnhbreakcó nhãn - Nếu tìm kiếm xong mà không tìm thấy số mục tiêu, in ra
"Target [target] not found"
Vị trí cần được báo cáo theo chỉ số bắt đầu từ 0 (hàng đầu tiên là 0, cột đầu tiên là 0).
Tự làm thử
// TODO: Viết code bên dưới
// Dùng các vòng lặp lồng nhau và break có nhãn để tìm giá trị cần tìm
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Logic và luồng điều khiển
1Luồng điều khiển nâng cao
Switch với `fallthrough`Thoát khỏi vòng lặp lồng nhauTiếp tục một vòng lặp cụ thểCâu lệnh `goto`Ôn tập: điều khiển vòng lặp nâng cao4Dự án: Danh sách việc cần làm đơn giản
Thiết lập dự ánThêm một việc cần làm2Struct và phương thức
Định nghĩa phương thức cho structReceiver giá trịReceiver con trỏChọn receiverPhương thức và hàmÔn tập: hành vi của struct5Tìm hiểu chuyên sâu về map
Map chứa structCon trỏ làm giá trị của mapKiểm tra map nilSo sánh các mapÔn tập: bộ đếm tần suất từ8Dự án: Quản lý hàng tồn kho đơn giản
Tổng quan dự ánKiểm tra hàng tồn kho3Interface (cơ bản)
Interface là gì?Định nghĩa interfaceTriển khai interfaceDùng kiểu interfaceInterface rỗngKhẳng định kiểuType switchÔn tập: hình dạng và hành viTự luyện tập: Trình biên dịch Go online