栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

奇怪的golang“附加”行为(覆盖切片中的值)

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

奇怪的golang“附加”行为(覆盖切片中的值)

这是因为在

for
循环中,您使用 副本 而不是slice / array元素本身进行操作。

for ... range
使得它遍历元素的副本,并追加此一时,循环变量的地址-
这是在所有的迭代相同。因此,您将相同的指针添加3次。而且此临时变量将
Foo{3}
在最后一次迭代(数组的最后一个元素)中设置为,因此这就是为什么您看到该变量打印了3次的原因。

修复:不添加循环变量的地址,而是添加数组元素的地址:

for i := range b {    a = append(a, &b[i])}

输出(在Go Playground上尝试):

{0} {1} {2} {3}

对此行为进行推理

在Go中,有 指针 类型和 非指针
类型,但是没有“引用”(在C
++和Java中使用的含义)。考虑到Go中没有“引用”类型的事实,这不是意外的行为。循环变量只是一个“普通”局部变量,它只能保存一个值(可以是指针或非指针),而不能保存引用。

从这个答案摘录:

指针是值,就像说

int
数字一样。区别在于该值的解释:指针被解释为内存地址,而
int
s被解释为整数。

当要改变类型的变量的值

int
,则通过一个指向
int
它的类型的
*int
,并且修改尖锐的物体:
*i =newvalue
(分配值是一个
int
)。

指针也是如此:当您想要更改指针类型的变量的值时

*int
,可以将指针传递给类型的指针,
*int
然后
**int
修改指向的对象:(
*i =&newvalue
分配的值为
*int
)。

总而言之,循环变量只是具有您要循环的数组/切片的元素类型的普通变量,并且要使其具有实际迭代的值,必须将值赋给该变量,该值将复制该值。在下一次迭代中将覆盖它。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/413147.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号