Câu lệnh `goto`
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 4 trên 68.
Câu lệnh goto trong Go cho phép bạn chuyển quyền điều khiển trực tiếp đến một câu lệnh có nhãn trong cùng hàm. Go có tính năng này, nhưng trong lập trình Go hiện đại, tính năng này hiếm khi được dùng vì người ta thường ưu tiên các cấu trúc điều khiển rõ ràng hơn như vòng lặp và câu lệnh if.
Để sử dụng goto, trước tiên bạn định nghĩa một nhãn bằng cách viết một định danh theo sau là dấu hai chấm. Sau đó, bạn có thể nhảy đến nhãn đó bằng cách viết goto theo sau là tên nhãn.
func main() {
i := 0
start:
fmt.Println("Count:", i)
i++
if i < 3 {
goto start
}
fmt.Println("Done!")
}Trong ví dụ này, chương trình quay lại nhãn start cho đến khi điều kiện không còn thỏa mãn. Tuy nhiên, dùng vòng lặp for sẽ giúp logic này rõ ràng hơn nhiều. Câu lệnh goto có thể khiến code khó đọc và bảo trì hơn, vì vậy người ta thường không khuyến khích dùng câu lệnh này thay cho luồng điều khiển có cấu trúc.
Thử thách
DễTrong thử thách này, bạn sẽ luyện tập dùng câu lệnh goto để tạo cơ chế thử lại đơn giản. Bạn sẽ xây dựng một hệ thống kết nối, hệ thống này sẽ thử thiết lập kết nối và thử lại một số lần cụ thể nếu thất bại.
Bạn sẽ nhận hai đầu vào:
- Một chuỗi biểu thị số lần thử lại tối đa (ví dụ:
"3") - Một chuỗi biểu thị số lần thử sẽ thành công (ví dụ:
"2")
Nhiệm vụ của bạn là:
- Phân tích số lần thử lại tối đa từ đầu vào thứ nhất
- Phân tích số lần thử sẽ thành công từ đầu vào thứ hai
- Dùng câu lệnh
gotocùng với một nhãn để triển khai logic thử lại - Bắt đầu với số lần thử là 1 và tăng lên sau mỗi lần thử thất bại
- Với mỗi lần thử thất bại, in ra
"Attempt [attempt_number] failed" - Khi số lần thử khớp với số lần thử thành công, in ra
"Attempt [attempt_number] succeeded"rồi thoát - Nếu vượt quá số lần thử lại tối đa mà vẫn chưa thành công, in ra
"All attempts failed"rồi thoát
Dùng câu lệnh goto để quay lại nhãn thử lại khi một lần thử thất bại và bạn chưa vượt quá số lần thử tối đa. Số lần thử bắt đầu từ 1.
Tự làm thử
package main
import (
"fmt"
"strconv"
)
func main() {
// Đọc đầu vào
var maxRetriesStr string
var successAttemptStr string
fmt.Scanln(&maxRetriesStr)
fmt.Scanln(&successAttemptStr)
// Chuyển các giá trị đầu vào thành số nguyên
maxRetries, _ := strconv.Atoi(maxRetriesStr)
successAttempt, _ := strconv.Atoi(successAttemptStr)
// Khởi tạo biến đếm số lần thử
attempt := 1
// TODO: Viết code bên dưới
// Dùng câu lệnh goto cùng nhãn để thực hiện logic thử lại
}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