web-dev-qa-db-fra.com

Comment ajouter un préfixe à une tranche

Je suis assez nouveau pour Go et donc ma question peut sembler un peu naïve.

j'ai une tranche que j'ai créée en utilisant

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

Je veux ajouter un entier à cette tranche, quelque chose comme

x = append(2, x)

mais évidemment cela ne fonctionnera pas car append a besoin d'une tranche comme premier argument.

J'ai essayé this mais cela ne fonctionne que pour les cordes et cela ne fonctionne pas dans mon cas.

8
coda

Utilisez une tranche littéral composite : []int{1}, Par exemple,

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

Aire de jeux: https://play.golang.org/p/Yc87gO7gJlD

Production:

[2 4 6 8]
[1 2 4 6 8]

Cependant, cette version plus efficace peut faire moins d'allocations. Une allocation n'est nécessaire que lorsqu'il n'y a pas de capacité de tranche de rechange.

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

Aire de jeux: https://play.golang.org/p/fswXul_YfvD

Production:

[2 4 6 8]
[1 2 4 6 8]

Un bon code doit être lisible. Dans Go, nous masquons souvent les détails d'implémentation dans une fonction. Les compilateurs Go optimisent les compilateurs, les petites fonctions simples (comme prependInt) sont intégrées.

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

Aire de jeux: https://play.golang.org/p/wl6gvoXraKH

Production:

4 4 [2 4 6 8]
5 8 [1 2 4 6 8]

Voir Go SliceTricks .

29
peterSO