内容简介:输出结果:为什么是这个结果呢, 因为例子中那么如何避免此类问题:
无论是普通的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 注意点
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
白帽子讲Web安全
吴翰清 / 电子工业出版社 / 2012-3 / 69.00元
《白帽子讲Web安全》内容简介:在互联网时代,数据安全与个人隐私受到了前所未有的挑战,各种新奇的攻击技术层出不穷。如何才能更好地保护我们的数据?《白帽子讲Web安全》将带你走进Web安全的世界,让你了解Web安全的方方面面。黑客不再变得神秘,攻击技术原来我也可以会,小网站主自己也能找到正确的安全道路。大公司是怎么做安全的,为什么要选择这样的方案呢?你能在《白帽子讲Web安全》中找到答案。详细的剖析......一起来看看 《白帽子讲Web安全》 这本书的介绍吧!