【Go】Go 语言教程--Go 语言范围(Range)(十五)

心已赠人 2023-10-13 17:48 196阅读 0赞

往期回顾:

  • Go 语言教程–介绍(一)
  • Go 语言教程–语言结构(二)
  • Go 语言教程–语言结构(三)
  • Go 语言教程–数据类型(四)
  • Go 语言教程–语言变量(五)
  • Go 语言教程–GO语言常量(六)
  • Go 语言教程–GO语言运算符(七)
  • Go 语言教程–GO条件和循环语句(八)
  • Go 语言教程–GO语言函数(九)
  • Go 语言教程–GO语言变量作用域(十)
  • Go 语言教程–GO语言数组(十一)
  • Go 语言教程–GO语言指针(十二)
  • Go 语言教程–GO语言结构体(十三)
  • Go 语言教程–GO语言切片(Slice)(十四)

文章目录

  • 怎么用?
  • 总结

range 关键字在 go 语言中是相当常用好用的语法糖,可以用在 for 循环中迭代 array、slice、map、channel、字符串所有涉及到遍历输出的东西。

怎么用?

我们在前一节循环中初次触及到了 range,也知道他可以省略key,或者省略value来循环遍历的特性,但是这种特性要结合实际情况考量该用哪一个。

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

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

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

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

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

  1. for key := range oldMap

或者这样:

  1. for key, _ := range oldMap

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

  1. for _, value := range oldMap

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

实例

  1. package main
  2. import "fmt"
  3. var pow = []int{
  4. 1, 2, 4, 8, 16, 32, 64, 128}
  5. func main() {
  6. for i, v := range pow {
  7. fmt.Printf("2**%d = %d\n", i, v)
  8. }
  9. }

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

  1. 2**0 = 1
  2. 2**1 = 2
  3. 2**2 = 4
  4. 2**3 = 8
  5. 2**4 = 16
  6. 2**5 = 32
  7. 2**6 = 64
  8. 2**7 = 128

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

实例

  1. package main
  2. import "fmt"
  3. func main() {
  4. map1 := make(map[int]float32)
  5. map1[1] = 1.0
  6. map1[2] = 2.0
  7. map1[3] = 3.0
  8. map1[4] = 4.0
  9. // 读取 key 和 value
  10. for key, value := range map1 {
  11. fmt.Printf("key is: %d - value is: %f\n", key, value)
  12. }
  13. // 读取 key
  14. for key := range map1 {
  15. fmt.Printf("key is: %d\n", key)
  16. }
  17. // 读取 value
  18. for _, value := range map1 {
  19. fmt.Printf("value is: %f\n", value)
  20. }
  21. }

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

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

range 遍历其他数据结构:

实例

  1. package main
  2. import "fmt"
  3. func main() {
  4. //这是我们使用 range 去求一个 slice 的和。使用数组跟这个很类似
  5. nums := []int{
  6. 2, 3, 4}
  7. sum := 0
  8. for _, num := range nums {
  9. sum += num
  10. }
  11. fmt.Println("sum:", sum)
  12. //在数组上使用 range 将传入索引和值两个变量。上面那个例子我们不需要使用该元素的序号,所以我们使用空白符"_"省略了。有时侯我们确实需要知道它的索引。
  13. for i, num := range nums {
  14. if num == 3 {
  15. fmt.Println("index:", i)
  16. }
  17. }
  18. //range 也可以用在 map 的键值对上。
  19. kvs := map[string]string{
  20. "a": "apple", "b": "banana"}
  21. for k, v := range kvs {
  22. fmt.Printf("%s -> %s\n", k, v)
  23. }
  24. //range也可以用来枚举 Unicode 字符串。第一个参数是字符的索引,第二个是字符(Unicode的值)本身。
  25. for i, c := range "go" {
  26. fmt.Println(i, c)
  27. }
  28. }

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

  1. sum: 9
  2. index: 1
  3. a -> apple
  4. b -> banana
  5. 0 103
  6. 1 111

总结

range可以用于for 循环中迭代 array、slice、map、channel、字符串所有涉及到遍历输出的东西。
for-range 的实现实际上是C风格的for循环
使用index,value接收range返回值会发生一次数据拷贝

发表评论

表情:
评论列表 (有 0 条评论,196人围观)

还没有评论,来说两句吧...

相关阅读