Ce face strings.Clone
În Go, tăierea unui text (s[i:j]) nu copiază octeții: bucata folosește aceeași memorie ca textul mare. Dacă păstrezi o bucată de 10 octeți dintr-un fișier de 100 MB citit în memorie, tot fișierul rămâne în memorie cât timp bucata este folosită.
strings.Clone(s) copiază octeții într-o zonă nouă. După clonare, textul mare poate fi eliberat de colectorul de memorie. Valoarea textului este aceeași; diferă doar locul din memorie.
Folosește-o rar, doar când știi că păstrezi bucăți mici din texte mari: copierea inutilă consumă mai multă memorie, nu mai puțină.
Parametri
| Parametru | Descriere |
|---|---|
s |
Textul de copiat. |
Ce returnează
O copie a textului, cu aceeași valoare. Pentru textul gol nu se alocă memorie.
Exemple
Exemplul 1: Bucata împarte memoria, clona nu
unsafe.StringData dă adresa primului octet. Comparăm adresele, nu le afișăm (ar fi diferite la fiecare rulare).
package main
import (
"fmt"
"strings"
"unsafe"
)
func main() {
mare := strings.Repeat("x", 1000) + "Iași"
bucata := mare[1000:]
clona := strings.Clone(bucata)
fmt.Println(bucata, clona, bucata == clona)
fmt.Println("bucata folosește memoria textului mare:", unsafe.StringData(bucata) == unsafe.StringData(mare[1000:]))
fmt.Println("clona folosește memoria textului mare: ", unsafe.StringData(clona) == unsafe.StringData(mare[1000:]))
}
Rezultat
Iași Iași true
bucata folosește memoria textului mare: true
clona folosește memoria textului mare: false
Greșeli frecvente
- Clonezi fiecare text „ca să fie sigur”. Textele în Go sunt imuabile, deci nu trebuie protejate de modificare; clonarea ajută doar la eliberarea memoriei.
Comenzi înrudite
strings.Builder: Construiește eficient un text din multe bucăți: adaugi cu WriteString, WriteByte, WriteRune sau Write și obții rezultatul cu String().strings.Cut: Taie textul în două la prima (Cut) sau ultima (CutLast) apariție a separatorului și spune dacă l-a găsit.