为什么Go slice`append()`不接受引用?
Go Lang的切片为什么Go slice`append()`不接受引用?,go,Go,Go Lang的切片append()可能会分配一个新的后备数组来为新项目腾出空间。因此,在调用z=append(x,y)之后,如果z的最前面的元素被修改,x本质上是未指定的——它可能与z具有相同的支持数组,也可能与z不具有相同的支持数组,并且z可以使用z[0]=foo对其支持数组进行变异,因此,它可能会也可能不会修改x的支持数组 那么,为什么要让这种丑陋浮出水面呢?将append的结果分配给除第一个参数以外的任何参数都是程序错误,为什么不让append取而代之的是*[]T,这样就不需要重新分配,
append()
可能会分配一个新的后备数组来为新项目腾出空间。因此,在调用z=append(x,y)
之后,如果z
的最前面的元素被修改,x
本质上是未指定的——它可能与z
具有相同的支持数组,也可能与z
不具有相同的支持数组,并且z
可以使用z[0]=foo
对其支持数组进行变异,因此,它可能会也可能不会修改x
的支持数组
那么,为什么要让这种丑陋浮出水面呢?将append的结果分配给除第一个参数以外的任何参数都是程序错误,为什么不让append
取而代之的是*[]T
,这样就不需要重新分配,也不需要悬空任何未定义的变量
这并不能解决所有情况,因为
a=x;追加(&x,y)
仍会使a
未定义,但局部改进似乎比没有好。在第一个示例(z=append(x,y)
)中,x
未定义并不完全正确。相反,x
仍然指向x
的原始内容,而z
指向这些内容,然后指向一些内容。正如你提到的,有两种可能性:
,在这种情况下,cap(x)>len(x)
只返回append
(即,扩展返回切片的长度以包含一个额外元素)x[:len(x)+1]
,在这种情况下,cap(x)=len(x)
通过复制append
的内容创建另一个数组,然后将x
作为y
-th元素追加len(x)
x
基本保持不变,即x
的所有元素仍然存在。显然,现在您必须小心,因为您可能有两个对相同基础数据的引用,但关键是保持x
的存在可能是有用的
也就是说,我同意让
append
获取一个指针可能更简单,而且我刚才描述的这个可能的用例可能不太常见,不足以保证潜在的混乱、稍微更详细的语义。修改了我的介绍,以澄清修改z
会使x
具有未指定的内容。