Go语言 range关键字循环迭代切片
Go语言有个特殊的关键字 range,它可以配合关键字 for 来迭代切片里的每一个元素。当迭代切片时,关键字 range 会返回两个值,第一个值是当前迭代到的索引位置,第二个值是该位置对应元素值的一份副本,如下图所示
需要强调的是,range 返回的是每个元素的副本,而不是直接返回对该元素的引用,如下所示
// 创建一个整型切片,并赋值 slice := []int{10, 20, 30} // 迭代每一个元素,并显示其值 for k, v := range slice { fmt.Printf("index:%d value:%d value-addr:%X elemm-addr:%X \n", k, v, &v, &slice[k]) }
输出结果为:
index:0 value:10 value-addr:C00000A0B0 elemm-addr:C000010340 index:1 value:20 value-addr:C00000A0B0 elemm-addr:C000010348 index:2 value:30 value-addr:C00000A0B0 elemm-addr:C000010350
因为迭代返回的变量是一个在迭代过程中根据切片依次赋值的新变量,所以 value 的地址总是相同的,要想获取每个元素的地址,需要使用切片变量和索引值(例如上面代码中的 &slice[k])。
当然,range 关键字不仅仅可以用来遍历切片,它还可以用来遍历数组、字符串、map 或者通道等。
package main import "fmt" func main() { // 创建一个整型切片,并赋值 slice := []int{10, 20, 30} // 迭代每一个元素,并显示其值 for k, v := range slice { fmt.Printf("index:%d value:%d value-addr:%X elemm-addr:%X \n", k, v, &v, &slice[k]) } fmt.Println("\n使用空白标识符(下划线)来忽略索引值") //使用空白标识符(下划线)来忽略索引值 for _, v := range slice { fmt.Printf(" value:%d \n", v) } fmt.Println("\n使用传统的 for 循环对切片进行迭代") //使用传统的 for 循环对切片进行迭代 for i := 0; i < len(slice); i++ { fmt.Printf(" value:%d \n", slice[i]) } }
执行结果