内容简介:输出结果:为什么是这个结果呢, 因为例子中那么如何避免此类问题:
无论是普通的for循环,还是for range遍历其定义的局部变量都会重复使用
- 且看下例
type person struct { name string age int } func main() { ma := []person{ person{"zhangsan", 11}, person{"lisi", 13}, person{"wangwu", 12}, } mb := []*person{} for _, v := range ma { mb = append(mb, &v) } fmt.Println(mb[0], mb[1], mb[2]) }
输出结果:
&{wangwu 12} &{wangwu 12} &{wangwu 12} Process finished with exit code 0
为什么是这个结果呢, 因为例子中 直接取了&v的地址 ,前文所说, for中定义的局部变量都会重复使用, 所以导致mb中的三个结果都指向了v的地址。
那么如何避免此类问题:
- 在遍历中不要使用局部变量的地址进行操作, 如下:
// 上例中的for range循环内部改为: for _, v := range ma { val := v mb = append(mb, &val) }
- 上例ma变量定义成[]*person 类型, 然后 在for range中可以进行直接赋值操作:
func main() { ma := []*person{ &person{"zhangsan", 11}, &person{"lisi", 13}, &person{"wangwu", 12}, } mb := []*person{} for _, v := range ma { val := v mb = append(mb, val) } fmt.Println(mb[0], mb[1], mb[2]) }
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 面试套路系列之用前序遍历团灭 8 类变形题
- 数组常见的遍历循环方法、数组的循环遍历的效率对比
- C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——遍历和删除
- Js遍历数组总结
- 遍历
- 遍历 DOM 注意点
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
HTML 5实战
陶国荣 / 机械工业出版社 / 2011-11 / 59.00元
陶国荣编著的《HTML5实战》是一本系统而全面的HTML 5教程,根据HTML 5标准的最新草案,系统地对HTML 5的所有重要知识点进行了全面的讲解。在写作方式上,本书以一种开创性的方式使理论与实践达到极好的平衡,不仅对理论知识进行了清晰而透彻的阐述,而且根据读者理解这些知识的需要,精心设计了106个完整(每个案例分为功能描述、实现代码、效果展示和代码分析4个部分)的实战案例,旨在帮助读者通过实......一起来看看 《HTML 5实战》 这本书的介绍吧!