Go 语言中的 range

在线程不安全的 map 中我们学习了 map 的遍历,里面使用了一个叫 range 的关键字来对 map 进行遍历操作。当时还提到了切片和数组都可以使用这个方法遍历。本文就来详细学习一下 range 关键字的用法。

Tips:本文提及的 map 均是线程不安全的 map。线程安全的 map 及其遍历方法参照 Go 语言中的map 一文。

 

1. 基本用法

range 可以用来遍历的对象有数组、切片、map、字符串以及通道。遍历的对象不同,range 的返回值也会有所不同。遍历数组、切片和字符串时,它返回的就是数据的索引和值。遍历map时返回的就是map的key和value。而遍历通道时则只返回通道中的数据

代码示例:

代码块
  • package main
  • 2
  • import (
  • 4        "fmt"
  • )
  • 6
  • func main() {
  • 8          str := "Codey"
  • 9          intArray := [5]int{1, 2, 3, 4, 5}
  • 10        intSlice := []int{1, 2, 3, 4, 5}
  • 11        m := map[string]string{"Apple": "苹果", "Orange": "橘子", "Banana": "香蕉"}
  • 12        c := make(chan int, 10)
  • 13        c <- 10
  • 14        c <- 11
  • 15        c <- 12
  • 16        c <- 13
  • 17        c <- 14
  • 18        fmt.Println("---字符串的遍历---")
  • 19        //遍历字符串
  • 20        for k, v := range str {
  • 21                fmt.Printf("索引:%d,值:%cn", k, v)
  • 22        }
  • 23        fmt.Println("---数组的遍历---")
  • 24        //遍历数组
  • 25        for k, v := range intArray {
  • 26                fmt.Printf("索引:%d,值:%dn", k, v)
  • 27        }
  • 28        fmt.Println("---切片的遍历---")
  • 29        //遍历切片
  • 30        for k, v := range intSlice {
  • 31                fmt.Printf("索引:%d,值:%dn", k, v)
  • 32        }
  • 33        fmt.Println("---map的遍历---")
  • 34        //遍历map
  • 35        for k, v := range m {
  • 36                fmt.Printf("key:%s,value:%sn", k, v)
  • 37        }
  • 38        fmt.Println("---通道的遍历---")
  • 39        //遍历通道
  • 40        for v := range c {
  • 41                fmt.Printf("值:%dn", v)
  • 42                if len(c) == 0 {
  • 43                        break
  • 44                }
  • 45        }
  • 46  }

执行结果:

图片描述

若是在开发过程中只想用到遍历对象的索引或者值,比如说一个map以汽车的车牌号为key存储了一些汽车的信息,但是你只想要操作车牌号。可以使用_来接收不需要使用的值。如果是只想用索引的话,可以直接只用一个参数接收遍历对象传出的值,默认只会接收索引

代码示例:

代码块
  • package main
  • 2
  • import (
  • 4          "fmt"
  • )
  • 6
  • func main() {
  • 8
  • 9          m := map[string]string{"Apple": "苹果", "Orange": "橘子", "Banana": "香蕉"}
  • 10        fmt.Println("---map的key值---")
  • 11        //只取key
  • 12        for k := range m {
  • 13                fmt.Printf("key:%sn", k)
  • 14        }
  • 15        fmt.Println("---map的value值---")
  • 16        //只取value
  • 17        for _, v := range m {
  • 18                fmt.Printf("value:%sn", v)
  • 19        }
  • 20  }

执行结果:

图片描述

 

2. 注意事项

在使用 range 的时候需要注意,我们无法通过range输出的值来修改遍历的对象,因为range相当于声明了两个变量,这两个变量逐一复制了遍历对象中的值,归根结底还是因为 Go 语言只有值传递,没有引用传递

代码示例:

代码块
  • package main
  • 2
  • import (
  • 4          "fmt"
  • )
  • 6
  • func main() {
  • 8
  • 9          intSlice := []int{1, 2, 3, 4, 5}
  • 10
  • 11         //遍历切片
  • 12        for k, v := range intSlice {
  • 13              fmt.Printf("索引:%d,索引地址:%pn", k, &k)
  • 14                fmt.Printf("值:%d,值地址:%pn", v, &v)
  • 15          }
  • 16  }

执行结果:

图片描述

 

3. 小结

本文主要介绍了 Go 语言中 range 关键字的用法,Go语言中可以 range 的对象有:字符串、数组、切片、map 和通道。其中用于接收 range 出来的值的变量是一个/两个不断被赋值的变量,所以这些变量的修改无法影响到正在被遍历的对象本身。

文章来源于网络,侵删!

相关新闻

历经多年发展,已成为国内好评如潮的Linux云计算运维、SRE、Devops、网络安全、云原生、Go、Python开发专业人才培训机构!