Ce face slices.Concat
slices.Concat(a, b, c) returnează un slice nou care conține elementele lui a, apoi ale lui b, apoi ale lui c. Slice-urile primite nu sunt modificate.
Față de append(append(a, b...), c...), Concat calculează întâi lungimea totală și alocă memoria o singură dată. Nici nu riscă să scrie în memoria lui a, cum poate face append când a are capacitate liberă.
Parametri
| Parametru | Descriere |
|---|---|
slices |
Slice-urile de lipit, în ordine. |
Ce returnează
Un slice nou cu toate elementele.
Exemple
Exemplul 1: Lipirea a trei liste
package main
import (
"fmt"
"slices"
)
func main() {
moldova := []string{"Iași", "Suceava"}
ardeal := []string{"Cluj", "Sibiu", "Brașov"}
banat := []string{"Timișoara"}
toate := slices.Concat(moldova, ardeal, banat)
fmt.Println(toate, len(toate))
}
Rezultat
[Iași Suceava Cluj Sibiu Brașov Timișoara] 6
Exemplul 2: De ce append poate surprinde
baza are loc liber, așa că ambele append scriu în aceeași memorie, iar x se schimbă. Concat creează mereu memorie nouă.
package main
import (
"fmt"
"slices"
)
func main() {
baza := make([]int, 2, 10)
x := append(baza, 1)
y := append(baza, 2)
fmt.Println(x, y)
x = slices.Concat(baza, []int{1})
y = slices.Concat(baza, []int{2})
fmt.Println(x, y)
}
Rezultat
[0 0 2] [0 0 2]
[0 0 1] [0 0 2]
Greșeli frecvente
- Construiești mai multe slice-uri din același slice de bază cu
appendși te miri că se suprascriu: foloseșteslices.Concatsauslices.Clone.
Comenzi înrudite
slices.Clone: Returnează o copie a unui slice, cu memorie proprie: modificările copiei nu afectează originalul.slices.Repeat: Returnează un slice nou care conține slice-ul x repetat de count ori.slices.Insert: Inserează una sau mai multe valori la poziția i și returnează slice-ul rezultat.