为什么Go slice`append()`不接受引用?

为什么Go slice`append()`不接受引用?,go,Go,Go Lang的切片append()可能会分配一个新的后备数组来为新项目腾出空间。因此,在调用z=append(x,y)之后,如果z的最前面的元素被修改,x本质上是未指定的——它可能与z具有相同的支持数组,也可能与z不具有相同的支持数组,并且z可以使用z[0]=foo对其支持数组进行变异,因此,它可能会也可能不会修改x的支持数组 那么,为什么要让这种丑陋浮出水面呢?将append的结果分配给除第一个参数以外的任何参数都是程序错误,为什么不让append取而代之的是*[]T,这样就不需要重新分配,

Go Lang的切片
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
    作为
    len(x)
    -th元素追加
在这两种情况下,
x
基本保持不变,即
x
的所有元素仍然存在。显然,现在您必须小心,因为您可能有两个对相同基础数据的引用,但关键是保持
x
的存在可能是有用的


也就是说,我同意让
append
获取一个指针可能更简单,而且我刚才描述的这个可能的用例可能不太常见,不足以保证潜在的混乱、稍微更详细的语义。

修改了我的介绍,以澄清修改
z
会使
x
具有未指定的内容。