Golang:即使在值更新后,Map上的for循环也会进入无限循环

ycl3bljg  于 2023-03-21  发布在  Go
关注(0)|答案(2)|浏览(136)
package main

import "fmt"

func main() {

    mapVal := map[string]string{
        "a": "k",
    }
    a := []string{"a", "b"}

    for i := range a {
        for _, ok := mapVal[a[i]]; ok; {
            i++
            fmt.Printf("the value of i is %d", i)
        }
    }

}

我在map上循环了一个嵌套循环_, ok := mapVal[a[i]]; ok;,第一次迭代i等于0,a[0] ==“a”返回值(_),ok(bool)为真,但第二次迭代i递增,i等于1,a[1] ==“b”表示ok(bool)应为假,但返回值为真,循环无限。

b09cbbtk

b09cbbtk1#

您在内部循环中使用了传统的for循环。
其格式为:

for i := 0; i < 10; i++ {
}

i := 0InitStmti < 10Conditioni++PostStmtPostStmt在每个循环迭代中运行。
在您的示例中,mapVal访问是InitStmt的一部分,okCondition的一部分,但没有PostStmt
因此,因为InitStmt只在for循环开始时运行一次,所以ok的值永远不会改变。

zf2sa74q

zf2sa74q2#

问题出在你的内部循环上。它不会为下一次重新分配ok的值,如果它的值为真,它就会进入无限循环。下面是我的更新:

package main

import "fmt"

func main() {

    mapVal := map[string]string{
        "a": "k",
    }
    a := []string{"a", "b"}

    for i := range a {
        for _, ok := mapVal[a[i]]; ok; {
            i++
            fmt.Printf("the value of i is %d\n", i)
            _, ok = mapVal[a[i]]
        }
    }

}

相关问题