Go 语言range关键字循环迭代切片

Posted personblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 
", 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 
", k, v, &v, &slice[k])
    }
    fmt.Println("
使用空白标识符(下划线)来忽略索引值")
    //使用空白标识符(下划线)来忽略索引值
    for _, v := range slice {
        fmt.Printf(" value:%d   
", v)
    }
    fmt.Println("
使用传统的 for 循环对切片进行迭代")
    //使用传统的 for 循环对切片进行迭代
    for i := 0; i < len(slice); i++ {
        fmt.Printf(" value:%d   
", slice[i])
    }
}

 

  执行结果

技术图片

以上是关于Go 语言range关键字循环迭代切片的主要内容,如果未能解决你的问题,请参考以下文章

Go 语言范围(Range)

Go 语言范围(Range)

吴裕雄--天生自然--Go 语言学习笔记--Go 语言范围(Range)

第 十五 课 Go 语言范围(Range)

Golang✔️走进 Go 语言✔️ 第十三课 range & map

Golang✔️走进 Go 语言✔️ 第十三课 range & map