【发布时间】:2014-11-28 02:43:27
【问题描述】:
我看到有人说只是通过附加旧切片来创建一个新切片
*slc = append(*slc[:item], *slc[item+1:]...)
但是如果你想删除切片中的最后一个元素呢?
如果您尝试将i(最后一个元素)替换为i+1,则会返回越界错误,因为没有i+1。
【问题讨论】:
标签: go
我看到有人说只是通过附加旧切片来创建一个新切片
*slc = append(*slc[:item], *slc[item+1:]...)
但是如果你想删除切片中的最后一个元素呢?
如果您尝试将i(最后一个元素)替换为i+1,则会返回越界错误,因为没有i+1。
【问题讨论】:
标签: go
您可以使用len() 查找长度并使用最后一个元素之前的索引重新切片:
if len(slice) > 0 {
slice = slice[:len(slice)-1]
}
【讨论】:
slice[:1],但为什么会出错? :(
slice[:1] 不会是“距离末尾有 1 个索引”......它的 1 作为范围的上限。
TL;DR:
myslice = myslice[:len(myslice) - 1]
顺便说一句,如果“myslice”的大小为零,这将失败。
更长的答案:
myslice = myslice[:len(myslice) - 1]
如果“myslice”大小为零,这将失败。
切片是指向底层数组的数据结构,切片切片等操作使用相同的底层数组。
这意味着如果您对切片进行切片,新切片仍将指向与原始切片相同的数据。
通过上述操作,最后一个元素仍会在数组中,但您将无法再引用它。
编辑
澄清: 如果您将切片重新切片为其原始长度,您将能够引用最后一个对象
/编辑
如果您有一个非常大的切片,并且您还想修剪底层数组以节省内存,您可能想使用“复制”创建一个具有较小底层数组的新切片,并让旧的大切片得到垃圾收集。
【讨论】: