copy în Go

Copiază elemente dintr-un slice în altul, cât încape în cel mai scurt, și returnează câte a copiat.

Sintaxă
func copy(dst, src []Type) int

n := copy(destinatie, sursa)
n := copy(octeti, "text")

Ce face copy

copy(dst, src) copiază elementele din src în dst, începând de la poziția 0, și returnează numărul de elemente copiate: minimul dintre len(dst) și len(src). copy nu mărește destinația: dacă ea are lungimea 0, nu se copiază nimic.

Funcționează corect chiar dacă cele două slice-uri se suprapun (de exemplu pentru a muta elemente în același slice). Caz special: sursa poate fi un text, iar destinația un []byte. Pentru o copie completă a unui slice, slices.Clone(s) este mai scurt.

Parametri

Parametru Descriere
dst Slice-ul în care se scrie; trebuie să aibă deja lungimea necesară.
src Slice-ul (sau textul, pentru []byte) din care se citește.

Ce returnează

Numărul de elemente copiate (int).

Exemple

Exemplul 1: Copie independentă

copie are propriul array; modificarea ei nu schimbă originalul.

package main

import "fmt"

func main() {
    original := []string{"Iași", "Cluj", "Arad"}
    copie := make([]string, len(original))
    n := copy(copie, original)
    copie[0] = "Galați"
    fmt.Println(n, original, copie)

    mic := make([]string, 2)
    fmt.Println(copy(mic, original), mic) // copiază doar cât încape

    var gol []string
    fmt.Println(copy(gol, original), gol) // destinație de lungime 0
}

Rezultat

3 [Iași Cluj Arad] [Galați Cluj Arad]
2 [Iași Cluj]
0 []

Exemplul 2: Ștergere prin mutare și copiere din text

copy pe slice-uri suprapuse mută elementele cu o poziție la stânga. Din text se copiază doar cei 4 octeți care încap.

package main

import "fmt"

func main() {
    coada := []string{"Ana", "Mihai", "Ioana", "Radu"}
    i := 1 // scoatem pe Mihai
    copy(coada[i:], coada[i+1:])
    coada = coada[:len(coada)-1]
    fmt.Println(coada)

    buf := make([]byte, 4)
    n := copy(buf, "Cluj-Napoca")
    fmt.Println(n, buf, string(buf))
}

Rezultat

[Ana Ioana Radu]
4 [67 108 117 106] Cluj

Greșeli frecvente

  • var dst []int; copy(dst, src): nu se copiază nimic, pentru că dst are lungimea 0. Creează-l cu make([]int, len(src)).
  • Argumentele inversate: primul este destinația, al doilea sursa.
  • dst := src crezând că este copie: ambele variabile folosesc același array.

Comenzi înrudite

  • append: Adaugă elemente la finalul unui slice și returnează slice-ul rezultat, mărind memoria când e nevoie.
  • slice-uri: Lista dinamică din Go: o fereastră peste un array, cu lungime (len) și capacitate (cap), care crește cu append.
  • make: Creează și inițializează slice-uri, map-uri și canale, cu lungime, capacitate sau buffer dat.