user200783
user200783

Reputation: 14346

In Go, how do I duplicate the last element of a slice?

If I have a Python list, it is simple to duplicate the last element: l.append(l[-1]). Is there an elegant way to do this with Go slices?

The best I have so far is data = append(data, data[len(data) - 1]).

Upvotes: 1

Views: 352

Answers (2)

icza
icza

Reputation: 418735

That is the proper way to do it.

In Go you can't use negative indices, so the index of the last element is len(data) -1.

And in Go append() is a builtin function and not a method of slices, and it returns a new slice value which you have to assign or store if you need the extended slice, so there's nothing you can make shorter in your code in general.

Note that if you were on to create your own type, you could attach methods to it which could simpify things. For example:

type ints []int

func (i *ints) append(es ...int) {
    *i = append(*i, es...)
}

func (i *ints) appendLast() {
    *i = append(*i, (*i)[len(*i)-1])
}

Using it:

is := ints{1, 2, 3}
fmt.Println(is)

is.append(4, 5) // Append some elements
fmt.Println(is)

is.append(is[len(is)-1]) // Append last element explicitly
fmt.Println(is)

is.appendLast() // Append last element using appendLast method
fmt.Println(is)

// You can also use it for []int values, with conversion:
is2 := []int{1, 2, 3}
(*ints)(&is2).appendLast()
fmt.Println(is2)

Output (try it on the Go Playground):

[1 2 3]
[1 2 3 4 5]
[1 2 3 4 5 5]
[1 2 3 4 5 5 5]
[1 2 3 3]

You can also use simple util functions without creating a new type:

func appendLast(i []int) []int {
    return append(i, i[len(i)-1])
}

func appendLast2(i *[]int) {
    *i = append(*i, (*i)[len(*i)-1])
}

func main() {
    is := []int{1, 2, 3}
    fmt.Println(is)

    is = appendLast(is)
    fmt.Println(is)

    appendLast2(&is)
    fmt.Println(is)
}

Output (try it on the Go Playground):

[1 2 3]
[1 2 3 3]
[1 2 3 3 3]

Upvotes: 3

Md. Al-Amin
Md. Al-Amin

Reputation: 1441

data = append(data, data[len(data) - 1])

Yes. It's the best way to do in Go. It's not possible to use a negative index in Go.

Upvotes: 1

Related Questions