博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Go:坑之for range
阅读量:4585 次
发布时间:2019-06-09

本文共 1384 字,大约阅读时间需要 4 分钟。

go只提供了一种循环方式,即for循环,在使用时可以像c那样使用,也可以通过for range方式遍历容器类型如数组、切片和映射。但是在使用for range时,如果使用不当,就会出现一些问题,导致程序运行行为不如预期。比如,下面的示例程序将遍历一个切片,并将切片的值当成映射的键和值存入,切片类型是一个int型,映射的类型是键为int型,值为*int,即值是一个地址。

package main import "fmt" func main() {    slice := []int{0, 1, 2, 3}    myMap := make(map[int]*int)     for index, value := range slice {        myMap[index] = &value    }    fmt.Println("=====new map=====")    prtMap(myMap)} func prtMap(myMap map[int]*int) {    for key, value := range myMap {        fmt.Printf("map[%v]=%v\n", key, *value)    }}

  运行程序输出如下:

=====new map=====map[3]=3map[0]=3map[1]=3map[2]=3

  由输出可以知道,不是我们预期的输出,正确输出应该如下:

=====new map=====map[0]=0map[1]=1map[2]=2map[3]=3

  

但是由输出可以知道,映射的值都相同且都是3。其实可以猜测映射的值都是同一个地址,遍历到切片的最后一个元素3时,将3写入了该地址,所以导致映射所有值都相同。其实真实原因也是如此,因为for range创建了每个元素的副本,而不是直接返回每个元素的引用,如果使用该值变量的地址作为指向每个元素的指针,就会导致错误,在迭代时,返回的变量是一个迭代过程中根据切片依次赋值的新变量,所以值的地址总是相同的,导致结果不如预期。

修正后程序如下:

package main import "fmt" func main() {    slice := []int{0, 1, 2, 3}    myMap := make(map[int]*int)     for index, value := range slice {        num := value        myMap[index] = &num    }    fmt.Println("=====new map=====")    prtMap(myMap)} func prtMap(myMap map[int]*int) {    for key, value := range myMap {        fmt.Printf("map[%v]=%v\n", key, *value)    }}

  运行程序输出如下:

=====new map=====map[2]=2map[3]=3map[0]=0map[1]=1

  

转载于:https://www.cnblogs.com/Miracle-boy/p/10136344.html

你可能感兴趣的文章
RTL基本知识:编译命令指定隐性线网类型
查看>>
java中BigDecimal在金融行业中的使用
查看>>
66.Plus One
查看>>
sqlserver 中 where 条件和 join 条件的作用比较
查看>>
Linux 连接mysql服务器
查看>>
shell脚本中大于,大于等于,小于,小于等于、不等于的表示方法
查看>>
[LeetCode] 256. Paint House_Easy tag: Dynamic Programming
查看>>
Java基础——面向对象编程一:封装
查看>>
在maven中没有的jar包如何处理?
查看>>
CSS3 3D下拉折叠菜单
查看>>
判断DOM元素是否出现再浏览器窗口中
查看>>
vue小技巧--window变量
查看>>
python--递归、二分查找算法
查看>>
mysql5.7 user表没有password字段,如何重置root密码
查看>>
【转】SVN 与 GIT 详细对比
查看>>
python面试
查看>>
apache错误日志(error_log)记录等级
查看>>
django下的 restful规范 Drf框架 psotman的安装使用 及一些容易遗忘的小点
查看>>
[转载]漫话:如何给女朋友介绍什么是死锁
查看>>
php header函数导出excel表格
查看>>