Как да получите последния елемент от среза?

Какъв е методът Go за извличане на последния елемент от среза?

var slice []int

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

slice[len(slice)-1:][0] // Retrieves the last element

Решението по-горе работи, но изглежда неудобно.


person Morgan Wilde    schedule 20.03.2014    source източник


Отговори (3)


Само за четене на последния елемент от срез:

sl[len(sl)-1]

За да го премахнете:

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

Вижте тази страница за трикове с парчета

person Toni Cárdenas    schedule 20.03.2014
comment
Благодаря много! Въпреки че изглежда глупаво, те не добавиха индекса -1, който Python има... - person Morgan Wilde; 20.03.2014
comment
Харесвам -1 от Python, въпреки че често води до трудни за отстраняване на грешки грешки. - person weberc2; 20.03.2014
comment
Съзнателно са го оставили навън. Беше неочевидно и склонно към грешки. Отидете като цяло и внимавайте относно „твърде много значение“; също така не включва претоварване на метод/оператор, стойности по подразбиране за параметри на функции и т.н., което IMHO отива в подобна философска насока. Вижте тази дискусия и други: groups.google.com/forum/#! topic/golang-nuts/yn9Q6HhgWi0 - person Toni Cárdenas; 20.03.2014
comment
Не съм сигурен, но получих panic: runtime error: index out of range за profiles[len(profiles)-1].UserId, предполагам, че дължината на среза е 0, така че се паникьосва? - person tom10271; 16.08.2019
comment
@tom10271 Да, не можете да получите последния елемент от среза, ако няма такъв елемент, т.е. ако изобщо няма елементи. - person Toni Cárdenas; 16.08.2019

Още по-неудобното е, че програмата ви се срива на празни парчета!

За да се борите с празни сегменти -- нулева дължина, причиняваща panic: runtime error, можете да имате последователност if/then/else или можете да използвате временен сегмент, за да решите проблема.

package main

import (
    "fmt"
)

func main() {
    // test when slice is not empty
    itemsTest1 := []string{"apple", "grape", "orange", "peach", "mango"}

    tmpitems := append([]string{"none"},itemsTest1...)
    lastitem := tmpitems[len(tmpitems)-1]
    fmt.Printf("lastitem: %v\n", lastitem)

    // test when slice is empty
    itemsTest2 := []string{}

    tmpitems = append([]string{"none"},itemsTest2...) // <--- put a "default" first
    lastitem = tmpitems[len(tmpitems)-1]
    fmt.Printf("lastitem: %v\n", lastitem)
}

което ще ви даде този резултат:

lastitem: mango
lastitem: none

За []int срезове може да искате -1 или 0 за стойност по подразбиране.

Мислейки на по-високо ниво, ако вашият срез винаги носи стойност по подразбиране, тогава tmp срезът може да бъде премахнат.

person warrens    schedule 28.03.2021

Малко по-малко елегантен, но може също така:

sl[len(sl)-1: len(sl)]
person ccdrm    schedule 27.01.2018
comment
Това е същото като sl[len(sl)-1:], но връща срез, съдържащ последния елемент, а не само последния елемент. play.golang.org/p/kcThrqa-64c - person Victor; 31.01.2018