Menu
CoddyTech

`goto` 语句

本课属于 Coddy GO 学习旅程的“逻辑与流程”单元。第 4 课,共 68 课。

Go 中的 goto 语句可以让你直接跳转到同一函数中的带标签语句。虽然 Go 提供了这一功能,但在现代 Go 编程中很少使用,因为人们更喜欢循环和 if 语句等更清晰的控制结构。

要使用 goto,你需要先定义一个标签,写下一个标识符,后面跟一个冒号。然后,你可以使用 goto 跳转到该标签,后面跟上标签名称。

func main() {
    i := 0
start:
    fmt.Println("Count:", i)
    i++
    if i < 3 {
        goto start
    }
    fmt.Println("Done!")
}

在这个示例中,只要条件仍然成立,程序就会跳回 start 标签。不过,使用 for 循环可以让相同的逻辑更加清晰。goto 语句会让代码更难阅读和维护,因此通常不建议使用它,而应优先采用结构化控制流。

challenge icon

挑战

简单

在这个挑战中,你将练习使用 goto 语句创建一个简单的重试机制。你要构建一个连接系统,尝试建立连接,如果失败,就重试指定次数。

你会收到两个输入:

  • 表示最大重试次数的字符串(例如,"3")
  • 表示成功的尝试次数的字符串(例如,"2")

你的任务是:

  1. 从第一个输入中解析最大重试次数
  2. 从第二个输入中解析成功的尝试次数
  3. 使用带标签的 goto 语句实现重试逻辑
  4. 从第 1 次尝试开始,每次尝试失败后都递增尝试次数
  5. 每次尝试失败时,输出 "Attempt [attempt_number] failed"
  6. 当尝试次数与成功的尝试次数相同时,输出 "Attempt [attempt_number] succeeded" 并退出
  7. 如果未能成功,且重试次数超过最大次数,则输出 "All attempts failed" 并退出

尝试失败且未超过最大重试次数时,使用 goto 语句跳回重试标签。尝试次数应从 1 开始。

亲手试试

package main

import (
    "fmt"
    "strconv"
)

func main() {
    // 读取输入
    var maxRetriesStr string
    var successAttemptStr string
    fmt.Scanln(&maxRetriesStr)
    fmt.Scanln(&successAttemptStr)
    
    // 将输入解析为整数
    maxRetries, _ := strconv.Atoi(maxRetriesStr)
    successAttempt, _ := strconv.Atoi(successAttemptStr)
    
    // 初始化尝试次数计数器
    attempt := 1
    
    // TODO:在下方编写你的代码
    // 使用带标签的 goto 语句实现重试逻辑
    
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: Go 在线编译器