2013-06-04 8 views
6

Quando si esegue una sottostringa di una stringa in Vai, non viene allocata alcuna nuova memoria. Invece, la rappresentazione sottostante della sottostringa contiene un puntatore Dati che è un offset del puntatore Dati della stringa originale.e il garbage collector Go

Ciò significa che se si dispone di una stringa di grandi dimensioni e si desidera tenere traccia di una piccola sottostringa, il garbage collector non sarà in grado di liberare una stringa grande finché non rilascio tutti i riferimenti alla sottostringa più corta.

Le fette presentano un problema simile, ma è possibile aggirare il problema eseguendo una copia della sottlice utilizzando copy(). Non sono a conoscenza di operazioni di copia simili per le stringhe. Qual è il modo più idiomatico e veloce per fare una "copia" di una sottostringa?

+1

Questa è una specie di difetto di Go. Dovrebbe essere possibile usare make (string, foo [x: y]) per questo. – fuz

risposta

1

Per esempio,

package main 

import (
    "fmt" 
    "unsafe" 
) 

type String struct { 
    str *byte 
    len int 
} 

func main() { 
    str := "abc" 
    substr := string([]byte(str[1:])) 
    fmt.Println(str, substr) 
    fmt.Println(*(*String)(unsafe.Pointer(&str)), *(*String)(unsafe.Pointer(&substr))) 
} 

uscita:

abc bc 
{0x4c0640 3} {0xc21000c940 2} 
+1

Questa soluzione non produce due copie della sottostringa? Uno per la conversione in [] byte e l'altro per la conversione in stringa? – Beevik

+1

Sì, sfortunatamente. Tuttavia, la porzione di byte è temporanea. – peterSO