share.png

Go 语言范围(Range)

Go 语言范围(Range)

日期:2022-07-07

本文字数:320 字 阅读完需:约 2 分钟

Go 语言范围(Range)

Go 语言中 range 关键字用于 for 循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素。在数组和切片中它返回元素的索引和索引对应的值,在集合中返回 key-value 对。

for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环。格式如下:

1for key, value := range oldMap { 2 newMap[key] = value 3}

以上代码中的 key 和 value 是可以省略。

如果只想读取 key,格式如下:

1for key := range oldMap

或者这样:

for key, _ := range oldMap

如果只想读取 value,格式如下:

1for _, value := range oldMap

实例

遍历简单的数组,2**%d 的结果为索引对应的次方数:

实例

package main

import "fmt"

var pow = [] int { 1 , 2 , 4 , 8 , 16 , 32 , 64 , 128 }

func main () {
for i , v := range pow {
fmt .Printf ( "2**%d = %d**\n**" , i , v )
}
}

以上实例运行输出结果为:

12**0 = 1 22**1 = 2 32**2 = 4 42**3 = 8 52**4 = 16 62**5 = 32 72**6 = 64 82**7 = 128

for 循环的 range 格式可以省略 key 和 value,如下实例:

实例

package main
import "fmt"

func main () {
map1 := make ( map [ int ] float32 )
map1 [ 1 ] = 1 . 0
map1 [ 2 ] = 2 . 0
map1 [ 3 ] = 3 . 0
map1 [ 4 ] = 4 . 0

// 读取 key 和 value
for key , value := range map1 {
fmt .Printf ( "key is: %d - value is: %f**\n**" , key , value )
}

// 读取 key
for key := range map1 {
fmt .Printf ( "key is: %d**\n**" , key )
}

// 读取 value
for _ , value := range map1 {
fmt .Printf ( "value is: %f**\n**" , value )
}
}

以上实例运行输出结果为:

1key is: 4 - value is: 4.000000 2key is: 1 - value is: 1.000000 3key is: 2 - value is: 2.000000 4key is: 3 - value is: 3.000000 5key is: 1 6key is: 2 7key is: 3 8key is: 4 9value is: 1.000000 10value is: 2.000000 11value is: 3.000000 12value is: 4.000000

range 遍历其他数据结构:

实例

package main
import "fmt"
func main () {
//这是我们使用 range 去求一个 slice 的和。使用数组跟这个很类似
nums := [] int { 2 , 3 , 4 }
sum := 0
for _ , num := range nums {
sum += num
}
fmt .Println ( "sum:" , sum )
//在数组上使用 range 将传入索引和值两个变量。上面那个例子我们不需要使用该元素的序号,所以我们使用空白符"_"省略了。有时侯我们确实需要知道它的索引。
for i , num := range nums {
if num == 3 {
fmt .Println ( "index:" , i )
}
}
//range 也可以用在 map 的键值对上。
kvs := map [ string ] string { "a" : "apple" , "b" : "banana" }
for k , v := range kvs {
fmt .Printf ( "%s -> %s**\n**" , k , v )
}

//range也可以用来枚举 Unicode 字符串。第一个参数是字符的索引,第二个是字符(Unicode的值)本身。
for i , c := range "go" {
fmt . Println (i , c )
}
}

以上实例运行输出结果为:

1sum: 9 2index: 1 3a -> apple 4b -> banana 50 103 61 111