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.
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 .