私はGoにかなり慣れていないので、私の質問は少し素朴に思えるかもしれません。
私が使用して作成したスライスがあります
var x []int;
for i := 2; i < 10; i += 2 {
x = append(x, i);
}
このスライスの前に整数を追加したい
x = append(2, x)
しかし、appendは最初の引数としてスライスを必要とするため、明らかに機能しません。
私は this を試しましたが、文字列に対してのみ機能し、私の場合は機能しません。
スライスを使用 複合リテラル :[]int{1}
、 例えば、
package main
import (
"fmt"
)
func main() {
var x []int
for i := 2; i < 10; i += 2 {
x = append(x, i)
}
fmt.Println(x)
x = append([]int{1}, x...)
fmt.Println(x)
}
遊び場: https://play.golang.org/p/Yc87gO7gJlD
出力:
[2 4 6 8]
[1 2 4 6 8]
ただし、このより効率的なバージョンでは、割り当てが少なくなります。割り当てが必要になるのは、予備のスライス容量がない場合のみです。
package main
import (
"fmt"
)
func main() {
var x []int
for i := 2; i < 10; i += 2 {
x = append(x, i)
}
fmt.Println(x)
x = append(x, 0)
copy(x[1:], x)
x[0] = 1
fmt.Println(x)
}
遊び場: https://play.golang.org/p/fswXul_YfvD
出力:
[2 4 6 8]
[1 2 4 6 8]
適切なコードは読み取り可能でなければなりません。 Goでは、実装の詳細を関数内に隠すことがよくあります。 Goコンパイラーは最適化コンパイラーであり、小さく単純な関数(prependInt
など)がインライン化されています。
package main
import (
"fmt"
)
func prependInt(x []int, y int) []int {
x = append(x, 0)
copy(x[1:], x)
x[0] = y
return x
}
func main() {
var x []int
for i := 2; i < 10; i += 2 {
x = append(x, i)
}
fmt.Println(len(x), cap(x), x)
x = prependInt(x, 1)
fmt.Println(len(x), cap(x), x)
}
遊び場: https://play.golang.org/p/wl6gvoXraKH
出力:
4 4 [2 4 6 8]
5 8 [1 2 4 6 8]
Go SliceTricks を参照してください。