slices.Concat în Go

Lipește mai multe slice-uri într-unul nou, alocat o singură dată.

Sintaxă
import "slices"

func Concat[S ~[]E, E any](slices ...S) S

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ște slices.Concat sau slices.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.