`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 语句会让代码更难阅读和维护,因此通常不建议使用它,而应优先采用结构化控制流。
挑战
简单在这个挑战中,你将练习使用 goto 语句创建一个简单的重试机制。你要构建一个连接系统,尝试建立连接,如果失败,就重试指定次数。
你会收到两个输入:
- 表示最大重试次数的字符串(例如,
"3") - 表示成功的尝试次数的字符串(例如,
"2")
你的任务是:
- 从第一个输入中解析最大重试次数
- 从第二个输入中解析成功的尝试次数
- 使用带标签的
goto语句实现重试逻辑 - 从第 1 次尝试开始,每次尝试失败后都递增尝试次数
- 每次尝试失败时,输出
"Attempt [attempt_number] failed" - 当尝试次数与成功的尝试次数相同时,输出
"Attempt [attempt_number] succeeded"并退出 - 如果未能成功,且重试次数超过最大次数,则输出
"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 语句实现重试逻辑
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Go 在线编译器