web-dev-qa-db-ja.com

intをスライスに追加する方法

私はGoにかなり慣れていないので、私の質問は少し素朴に思えるかもしれません。

私が使用して作成したスライスがあります

var x []int;
for i := 2; i < 10; i += 2 {
    x = append(x, i);
}

このスライスの前に整数を追加したい

x = append(2, x)

しかし、appendは最初の引数としてスライスを必要とするため、明らかに機能しません。

私は this を試しましたが、文字列に対してのみ機能し、私の場合は機能しません。

8
coda

スライスを使用 複合リテラル[]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 を参照してください。

29
peterSO