ChatGPT解决这个技术问题 Extra ChatGPT

如何从切片中删除最后一个元素?

go

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

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

但是如果你想删除切片中的最后一个元素呢?

如果您尝试将 i(最后一个元素)替换为 i+1,则会返回超出范围的错误,因为没有 i+1


S
Simon Whitehead

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

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

Click here to see it in the playground


看到虽然它会是 slice[:1],但我会有,为什么这是错误的? :(
我本来希望 slice[:1] 删除最后一个元素
@OlegzandrDenman The documentation discusses 不过是上下界。 slice[:1] 不会是“距离末端 1 个索引”......它的 1 作为范围的上限。
我可以提一下 <kbd> 的使用吗? Go Playground 链接的标签相当优雅
笔记。这会产生这么多垃圾。
g
ggorlen

TL;博士:

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

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

更长的答案:

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

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

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

如果您将切片重新切片为其原始长度,您将能够引用最后一个对象

如果您有一个非常大的切片,并且您还想修剪底层数组以节省内存,您可能想使用“复制”创建一个具有较小底层数组的新切片,并让旧的大切片被垃圾收集。


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅