Menu
CoddyTech

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.

challenge icon

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à:

  1. Phân tích số lần thử lại tối đa từ đầu vào thứ nhất
  2. Phân tích số lần thử sẽ thành công từ đầu vào thứ hai
  3. Dùng câu lệnh goto cùng với một nhãn để triển khai logic thử lại
  4. 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
  5. Với mỗi lần thử thất bại, in ra "Attempt [attempt_number] failed"
  6. 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
  7. 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
    
}
quiz iconTự kiểm tra

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

Tự luyện tập: Trình biên dịch Go online