Golang问题:遍历map的嵌套循环陷入无限循环,索引更新未终止
Go嵌套循环无限循环问题分析与修复
问题代码
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) } } }
问题原因
内层for循环的初始化语句_, ok := mapVal[a[i]]仅在循环启动时执行一次,后续迭代不会重新计算ok的值。首次循环时i=0,a[0]在map中,ok为true;当i自增到1后,a[1]不在map中,但ok仍保持初始的true,导致循环无限执行。
修复方案
方案一:在循环后置语句中重新更新ok
每次循环迭代都重新检查当前i对应的元素是否在map中:
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; _, ok = mapVal[a[i]] { fmt.Printf("the value of i is %d\n", i) i++ // 防止i超出切片长度引发索引越界 if i >= len(a) { break } } } }
方案二:将判断逻辑移到循环体内(更直观)
把ok的检查放到循环内部,不满足条件就主动break:
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]] if !ok { break } fmt.Printf("the value of i is %d\n", i) i++ if i >= len(a) { break } } } }
两种方案都解决了无限循环的问题,同时加入了i超出切片长度的判断,避免出现索引越界panic。
内容的提问来源于stack exchange,提问作者Karthik
相关产品推荐
相关产品推荐

