私はPythonのリストを持っている場合、最後の要素を複製するのは簡単です:l.append(l[-1])
。 Goスライスでこれを行うエレガントな方法はありますか?Goでは、スライスの最後の要素を複製するにはどうすればよいですか?
これまでのベストはdata = append(data, data[len(data) - 1])
です。
私はPythonのリストを持っている場合、最後の要素を複製するのは簡単です:l.append(l[-1])
。 Goスライスでこれを行うエレガントな方法はありますか?Goでは、スライスの最後の要素を複製するにはどうすればよいですか?
これまでのベストはdata = append(data, data[len(data) - 1])
です。
これは適切な方法です。
Inでは、負のインデックスを使用できないため、最後の要素のインデックスは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]
data = append(data, data[len(data) - 1])
はい。 Goで行うのが最善の方法です。 Goで負のインデックスを使用することはできません。