Golang Range关键字的秘密

栏目: Go · 发布时间: 6年前

内容简介:Go 语言中 range 关键字用于 for 循环中迭代,支持类型如下:使用起来非常方便这个简单的使用方法里面,对新手来说,还是有坑的,而且非常不容易被发现。

Go 语言中 range 关键字用于 for 循环中迭代,支持类型如下:

  • 数组(array)
  • 切片(slice)
  • 通道(channel)
  • 集合(map)
    它返回元素的索引和索引对应的值,在集合中返回 key-value 对的 key 值。

使用起来非常方便

for index, value := range myArray {
    fmt.Println("index: " + index)
    fmt.Println("value: " + value)
}

这个简单的使用方法里面,对新手来说,还是有坑的,而且非常不容易被发现。

package main

import "fmt"

type student struct {
    Name string
    Age  int
}

func main() {
    var stus []student
    stus = []student{
        {Name: "one", Age: 18},
        {Name: "two", Age: 19},
    }
    data := make(map[int]*student)

    // code1 这是不对的使用方法
    for i, v := range stus {
        data[i] = &v
    }
    for i, v := range data {
        fmt.Printf("error: key=%d, value=%v \n", i, *v)
    }

    // code2 这是正确的使用方法
    for i, _ := range stus {
        data[i] = &stus[i]
    }
    for i, v := range data {
        fmt.Printf("right: key=%d, value=%v \n", i, *v)
    }
}

输出结果是:

error: key=0, value={two 19}
error: key=1, value={two 19}
right: key=0, value={one 18}
right: key=1, value={two 19}

原因很明显:

用for range来遍历的时候,被遍历的指针是不变的,每次遍历仅执行struct值的拷贝,即上面代码中的变遍历的 [v] 是对struct的值拷贝,因此 code1中 data[i] = &v 永远取的值都是 v这个遍历的地址。


以上所述就是小编给大家介绍的《Golang Range关键字的秘密》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

设计方法卡牌

设计方法卡牌

罗莎 等 / 电子工业出版社 / 2017-7 / 79.00

本套设计素材提供了54种设计方法,以卡牌的形式展示给读者,每张卡牌包括该设计方法的基本描述、目的、时间成本、工具渠道、使用阶段、操作步骤及其归类属性等信息。在做设计时,可以根据自己的需求进行卡牌的选择和组合,让设计工作更有灵活性和趣味性。同时,依据设计产品属性的不同,卡牌提供了选择设计方法的推荐模板、方法组合模板、产品阶段划分模板,给初学者在做设计时提供一定的理论依据,帮助读者启发设计灵感,剖析设......一起来看看 《设计方法卡牌》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

URL 编码/解码
URL 编码/解码

URL 编码/解码