美文网首页go学习
go的数组(切片)range遍历小坑

go的数组(切片)range遍历小坑

作者: 咕咕鷄 | 来源:发表于2017-01-17 21:52 被阅读444次

原创文章转载请注明出处

go的数组元素可以通过 索引(位置)来读取(或者修改),索引从 0 开始,第一个元素索引为 0,第二个索引为 1,以此类推。

可以通过for结构遍历数组,实现以下功能:

  • 通过 for 初始化数组项
  • 通过 for 打印数组元素
  • 通过 for 依次处理元素

for结构的基本使用方式如下:

package main
import "fmt"

func main() {
    var arr1 [5]int

    for i:=0; i < len(arr1); i++ {
        arr1[i] = i * 2
    }

    for i:=0; i < len(arr1); i++ {
        fmt.Printf("Array at index %d is %d\n", i, arr1[i])
    }
}

for 循环中的条件非常重要:i < len(arr1),如果写成 i <= len(arr1) 的话会产生越界错误。所以,我们一般用关键字range来避免这种错误。

for i, v:= range arr1 {
  ...
}

当然以上两种 for 结构对于切片(slices)来说也同样适用。

需要注意的问题来了,通过range遍历得到的value是值拷贝。

type s struct {
    i int
}

func main() {
    m := make([]s, 0)
    m = append(m, s{i: 0})
    m = append(m, s{i: 1})
    m = append(m, s{i: 2})
    for _, e := range m { //e是值拷贝
        e.i = 3
    }
    for _, x := range m {
        fmt.Printf("%v\n", x.i)
    }
}

上述代码第一个for循环中的e是原值的拷贝,所以e.i = 3并没有修改原数组中的元素,所以输出的结果如下:

0
1
2

如果非要在使用range遍历的过程中修改数组内容,那么还是要用下标访问数组元素。

type s struct {
    i int
}

func main() {
    m := make([]s, 0)
    m = append(m, s{i: 0})
    m = append(m, s{i: 1})
    m = append(m, s{i: 2})
    for index := range m { //获取索引
        m[index].i = 3 //通过下标获取元素进行修改
    }
    for _, x := range m {
        fmt.Printf("%v\n", x.i)
    }
}

输出

3
3
3

我是咕咕鸡,一个还在不停学习的全栈工程师。
热爱生活,喜欢跑步,家庭是我不断向前进步的动力。

相关文章

  • go的数组(切片)range遍历小坑

    原创文章转载请注明出处 go的数组元素可以通过 索引(位置)来读取(或者修改),索引从 0 开始,第一个元素索引为...

  • 八、Go range的用法

    八、Go语言range Go 语言中 range 关键字用于 for 循环中迭代数组(array)、切片(slic...

  • 21. range用法

    range是一个内置函数。可以遍历数组、切片slice、字典map。当遍历数组和切片的时候,返回的是索引和元素。当...

  • go学习笔记: range函数

    range函数是个神奇而有趣的内置函数,你可以使用它来遍历数组,切片和字典。 当用于遍历数组和切片的时候,rang...

  • Go语言中for range的"坑"

    前言 Go 中的for range组合可以和方便的实现对一个数组或切片进行遍历,但是在某些情况下使用for ran...

  • 范围和映射(五)

    一、范围(Range) 作用:遍历数组、切片、映射,类似于for-each 使用方法: 注意事项:range会返回...

  • day02-08make_slice

    make定义切片的长度和容量 切片的赋值 切片的遍历 索引遍历 for range循环

  • Go的数组和指针

    一、 定义数组 二、 遍历数组 下标遍历 range遍历(index) range遍历(index,value) ...

  • Golang Range关键字的秘密

    Go 语言中 range 关键字用于 for 循环中迭代,支持类型如下: 数组(array) 切片(slice) ...

  • Go语言范围(Range)

    Go 语言中 range 关键字用于 for 循环中迭代数组(array)、切片(slice)、通道(channe...

网友评论

    本文标题:go的数组(切片)range遍历小坑

    本文链接:https://www.haomeiwen.com/subject/dhhvbttx.html