Golang中为什么for循环内的变量没有被更新?
Golang中为什么for循环内的变量没有被更新?
在 main 函数中有一个名为 shoot 的变量没有被更新。在下面的代码中,有一个内部 for 循环,其结束条件是 i < 8(即 i := 0; i < 8; i++)。循环的每次迭代代表一座山,每次迭代都有一个变量 mountainH,代表当前山的高度。这个练习的要求是,为了获胜,需要射击最高的山。shoot 变量从未被更新,你能帮我解决这个问题吗?
func main() {
for {
shoot := 0 // 这是我想用来更新的变量
hightestMountain := 0
for i := 0; i < 8; i++ {
var mountainH int
if mountainH > hightestMountain { // mountainH 永远不会是 0,因为游戏引擎在每次迭代中都会赋予它相应的值
hightestMountain = mountainH
shoot = i // 我想在这里更新它
}
fmt.Scan(&mountainH)
}
fmt.Println(shoot) // 但我总是得到 0
}
}
你可以在此游戏板上测试此代码:Game board
更多关于Golang中为什么for循环内的变量没有被更新?的实战教程也可以访问 https://www.itying.com/category-94-b0.html
非常感谢,同时也感到抱歉,因为我刚开始学习 Go 语言,不知道 fmt.Scan 会对代码产生如此大的影响。
更多关于Golang中为什么for循环内的变量没有被更新?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你是否需要将 fmt.Scan(&mountainH) 移到 if 语句之前?
如果这是从游戏引擎更新变量的部分,那么当前的操作是:创建变量,进行测试,然后更新,最后在代码进入 for 循环的下一次迭代时丢失该值。相反,你需要创建变量,更新它,然后再进行测试。
在 main 函数中,shoot 变量在每次外层 for 循环迭代时都被重新初始化为 0,导致内层循环中更新的值在下一次外层循环时被重置。此外,mountainH 的读取顺序也有问题:在比较和更新最高山之前,应该先读取 mountainH 的值。以下是修正后的代码:
func main() {
for {
shoot := 0
highestMountain := 0
for i := 0; i < 8; i++ {
var mountainH int
fmt.Scan(&mountainH) // 先读取山的高度
if mountainH > highestMountain {
highestMountain = mountainH
shoot = i // 更新射击目标
}
}
fmt.Println(shoot) // 输出最高山的索引
}
}
在这个修正版本中,shoot 和 highestMountain 在外层循环的每次迭代开始时初始化,内层循环中先读取 mountainH 再进行比较和更新,确保 shoot 能正确记录最高山的索引。

