如果我错了,请纠正我,Go中只有3种循环类型。
Type1(最基本的类型,有一个条件):
for i <= 3 {...}
Type2(经典for循环)
for j := 7; j <= 9; j++ {...}
Type3(无限循环取决于中断)
for {...break}
然后我遇到了这个for循环,该循环对数组
中的值求和nums := []int{2, 3, 4}
sum := 0
for _, num := range nums {
sum += num
}
fmt.Println("sum:", sum)//"sum: 9"
上述for-loop
是否被认为是 Type1 ,它会自动应用<=
并将数字范围作为最大值?我可以以任何方式更改值吗?也许我需要两个额外的循环?我们可以应用类似range + 2
的东西吗?
答案 0 :(得分:2)
来自Effective Go:
Go for循环类似于C,但不相同。它在一段时间内统一,没有时间。共有三种形式,其中只有一种具有分号。
// Like a C for for init; condition; post { } // Like a C while for condition { } // Like a C for(;;) for { }
它继续:
如果要遍历数组,切片,字符串或映射,或者从通道读取,则range子句可以管理循环。
for key, value := range oldMap { newMap[key] = value }
由此,我将range
循环视为for condition { }
循环,其中 condition (例如,是这样)是将变量指定为array / slice / string / map / chan不是零,尽管实际上nil
值也可以正常工作
for _, v := range []interface{}{nil, nil, nil, nil} {
// will still iterate four times
}
实际上,将Go的for
循环视为C样式for init; condition; post
循环,经典while
循环和更现代的{ {3}}循环。
答案 1 :(得分:0)
Type1 的工作方式几乎与其他语言中的while
相似。由于在这种情况下,go语言中没有while
用于该语言。
Type2 是经典的for
循环,就像您所说的其他语言一样。
Type3 用于覆盖数组,切片,地图等各种数据结构
数组和切片上的range为每个数组提供索引和值 像您给出的示例一样的条目
nums := []int{2, 3, 4}
sum := 0
for _, num := range nums {
sum += num
}
fmt.Println("sum:", sum)//"sum: 9"
地图上的范围会在键/值对上进行迭代。
kvs := map[string]string{"a": "apple", "b": "banana"}
for k, v := range kvs {
fmt.Printf("%s -> %s\n", k, v)
}
字符串上的range遍历Unicode代码点。第一个值是 符文的起始字节索引,第二个符文本身。
for i, c := range "go" {
fmt.Println(i, c)
}
有关更多信息,请访问Go by example网站以了解范围的使用情况