我见过有人说只是通过附加旧切片来创建新切片

1
*slc = append(*slc[:item], *slc[item+1:]...)

但是,如果要删除切片中的最后一个元素怎么办?

如果尝试用i+1替换i(最后一个元素),则由于没有i+1,它会返回超出范围的错误。


您可以使用len()查找长度,并使用最后一个元素之前的索引重新切片:

1
2
3
if len(slice) > 0 {
    slice = slice[:len(slice)-1]
}

单击此处在操场上查看它

  • 如果len(slice) == 0panic: runtime error: slice bounds out of range,则失败。
  • ...嗯,是。 那不是问题的一部分..但是我将更新我的答案以帮助您。
  • 同样,没有:=,slice已经定义。:)
  • 确实对两者都有。 固定。

TL; DR:

1
myslice = myslice[:len(myslice) - 1]

顺便说一句,如果" myslice"的大小为零,这将失败。

更长的答案:

1
myslice = myslice[:len(myslice) - 1]

如果" myslice"的大小为零,这将失败。

切片是指向底层数组的数据结构,切片等操作使用相同的底层数组。

这意味着,如果对切片进行切片,则新切片仍将指向与原始切片相同的数据。

通过执行上述操作,最后一个元素仍将位于数组中,但您将无法再引用它。

编辑

澄清:
如果您将切片重新切片为原始长度,则可以引用最后一个对象

/编辑

如果您有一个很大的切片,并且还想修剪底层数组以节省内存,则可能要使用"复制"来创建一个具有较小底层数组的新切片,并让旧的大切片得到垃圾回收。

  • @tommywild:添加了有关引用最后一个元素的说明。 我确实了解到,在"删除"该元素时,您会做什么,这是隐式的。 实际上,您也可以只使用append。 如果此更改使您满意,可以删除-1吗? 老实说,我什至不认为它应该是-1之前的样子:/
  • @tommywild好的:)无论如何,您的观点是正确的,感谢您指出:)
  • 不知道为什么-1或者..所以要另外投票。 您的答案实际上比我的答案更全面。
  • @SimonWhitehead谢谢男人:)