在Go中循环范围

时间:2018-07-06 03:11:33

标签: loops go

如果我错了,请纠正我,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的东西吗?

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网站以了解范围的使用情况