【问题标题】:How to remove the last element from a slice?如何从切片中删除最后一个元素?
【发布时间】:2014-11-28 02:43:27
【问题描述】:

我看到有人说只是通过附加旧切片来创建一个新切片

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

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

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

【问题讨论】:

    标签: go


    【解决方案1】:

    您可以使用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 作为范围的上限。
    • 我可以提一下,Go Playground 链接使用 标签是相当优雅的
    • 注意。这会产生很多垃圾。
    【解决方案2】:

    TL;DR:

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

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

    更长的答案:

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

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

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

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

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

    编辑

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

    /编辑

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

    【讨论】:

    • @tommywild:添加了关于引用最后一个元素的说明。我确实明白,在“删除”元素时解释了你在做什么,这有点隐含。事实上,你也可以只使用 append。如果此更改使您满意,您可以删除 -1 吗?老实说,我什至不认为它应该得到 -1 之前的样子:/
    • @tommywild 好的 :) 无论如何,您的观点是有效的,感谢您指出 :)
    • 也不知道为什么是-1 ..所以再投一个赞成票。你的回答其实比我的更全面。
    猜你喜欢
    • 1970-01-01
    • 2019-02-02
    • 2014-05-21
    • 1970-01-01
    • 2016-03-10
    • 2014-12-09
    • 2021-08-10
    • 2014-04-27
    • 2021-12-16
    相关资源
    最近更新 更多