如果我有一个Python列表,复制最后一个元素很简单:l.append(l[-1])
。使用Go切片有一种优雅的方法吗?
我到目前为止最好的是data = append(data, data[len(data) - 1])
。
答案 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中使用负索引是不可能的。