在Go中,如何复制切片的最后一个元素?

时间:2017-09-22 11:22:47

标签: go append slice

如果我有一个Python列表,复制最后一个元素很简单:l.append(l[-1])。使用Go切片有一种优雅的方法吗?

我到目前为止最好的是data = append(data, data[len(data) - 1])

2 个答案:

答案 0 :(得分:3)

这是正确的方法。

在Go中,您不能使用负数索引,因此最后一个元素的索引为len(data) -1

在Go append()中是内置函数而不是切片方法,它返回一个新的切片值,如果需要扩展切片,则必须分配或存储,所以没有什么你可以缩短你的代码。

请注意,如果您要创建自己的类型,则可以附加方法,这可能会简化事情。例如:

type ints []int

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

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

使用它:

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)

输出(在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]

您也可以使用简单的util函数而无需创建新类型:

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)
}

输出(在Go Playground上尝试):

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

答案 1 :(得分:1)

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

是。这是Go的最佳方式。在Go中使用负索引是不可能的。