切片的最后一个元素

Mor*_*lde 152 go slice

什么是__CODE__用于提取的最后一个元素的方式__CODE__

var slice []int

slice = append(slice, 2)
slice = append(slice, 7)

slice[len(slice)-1:][0] // Retrieves the last element
Run Code Online (Sandbox Code Playgroud)

上面的解决方案有效,但似乎很尴尬.

Ton*_*nas 266

只需读取切片的最后一个元素:

sl[len(sl)-1]
Run Code Online (Sandbox Code Playgroud)

要删除它:

sl = sl[:len(sl)-1]
Run Code Online (Sandbox Code Playgroud)

有关切片技巧,请参阅此页面

  • 谢谢你!即使它看起来很傻,但他们没有添加`-1`索引Python有...... (29认同)
  • 他们有意识地把它留在了外面.这是不明显的,容易出错.总体上是对"太多意义"的谨慎态度; 它也不具有方法/运算符重载,函数参数的默认值等等,其中恕我直言的观点类似于哲学.请参阅此讨论和其他内容:https://groups.google.com/forum/#!topic/golang -nuts /yn9Q6HhgWi0 (10认同)
  • 我喜欢Python的`-1`,虽然它经常导致难以调试的错误. (2认同)
  • 我不确定,但我得到了 `profiles[len(profiles)-1].UserId` 的 `panic: runtime error: index out of range`,我猜切片的长度是 0 所以它会恐慌? (2认同)
  • @tom10271是的,如果没有这样的元素,则无法获取切片的最后一个元素,即。如果根本没有元素。 (2认同)

jub*_*0bs 8

如果您可以使用 Go 1.18 或更高版本,并且经常需要访问某些任意元素类型的切片的最后一个元素,那么使用小型自定义函数可以提高调用站点的可读性。另请参阅Roger Peppe 的Generics Unconstrained演讲,其中他描述了一个类似的函数来获取切片的第一个元素(如果有)。

package main

import "fmt"

func Last[E any](s []E) (E, bool) {
    if len(s) == 0 {
        var zero E
        return zero, false
    }
    return s[len(s)-1], true
}

func main() {
    var numbers []int
    fmt.Println(Last(numbers)) // 0 false
    numbers = []int{4, 8, 15, 16, 23, 42}
    fmt.Println(Last(numbers)) // 42 true
}
Run Code Online (Sandbox Code Playgroud)

游乐场

不过,无需为该功能创建库Last一点点复制胜过一点点依赖

  • 现在有[提案](https://github.com/golang/go/issues/53510)将其添加到 `x/exp/slices` (3认同)
  • @BenjaminR 对此感觉很复杂,正如你从 jub0bs 的回答中看到的,该功能真的很容易实现。我想我可以支持[Rob Pike的评论](https://github.com/golang/go/issues/53510#issuecomment-1183693014) (2认同)
  • @blackgreen 在我使用 Go 的 8 年里,我认为当我说这个理由正是为什么讨厌 Go 的人“真的”讨厌它时,我不仅仅是在为自己说话。如果我是维护者,我会同意 Pike 的观点,但作为用户,我不能。我很高兴有“一种且只有一种做事的方式”,但使用 `s[len(s)-1]` 实际上并没有*做*这件事,因为你需要检查 `s != nil ` 和 `len(s) > 0` 之前这样做。每一次。我重视缺乏愚蠢的冗余。 (2认同)

Leo*_*rdo 5

您可以使用该len(arr)函数,尽管它将返回从 1 开始的切片的长度,并且由于 Go 数组/切片从索引 0 开始,最后一个元素实际上是len(arr)-1

例子:

arr := []int{1,2,3,4,5,6} // 6 elements, last element at index 5
fmt.Println(len(arr)) // 6
fmt.Println(len(arr)-1) // 5
fmt.Println(arr[len(arr)-1]) // 6 <- element at index 5 (last element)
Run Code Online (Sandbox Code Playgroud)