strings.Clone în Go

Returnează o copie nouă a textului, în memorie separată; utilă când păstrezi o bucată mică dintr-un text foarte mare.

Sintaxă
func Clone(s string) string

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.