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ădstare lungimea 0. Creează-l cumake([]int, len(src)).- Argumentele inversate: primul este destinația, al doilea sursa.
dst := srccrezâ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.