Golang Range关键字的秘密

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

内容简介: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关键字的秘密》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

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

Algorithms Illuminated (Part 2)

Algorithms Illuminated (Part 2)

Tim Roughgarden / Soundlikeyourself Publishing, LLC / 2018-8-5 / USD 17.99

Algorithms are the heart and soul of computer science. Their applications range from network routing and computational genomics to public-key cryptography and machine learning. Studying algorithms can......一起来看看 《Algorithms Illuminated (Part 2)》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具