2013-06-04 12 views
6

Podczas pobierania podciągów w łańcuchu, nie jest przydzielana nowa pamięć. Zamiast tego podstawowa reprezentacja podłańcucha zawiera wskaźnik danych, który jest przesunięciem wskaźnika danych pierwotnego łańcucha.podłańcuchy i urządzenie do zbierania śmieci Go

Oznacza to, że jeśli mam duży ciąg i chcę śledzić mały fragment, śmieciarz nie będzie mógł zwolnić żadnego z dużych ciągów, dopóki nie zwolnię wszystkich odniesień do krótszego podciągu.

Plastry mają podobny problem, ale można obejść go, wykonując kopię podpórki za pomocą funkcji copy(). Nie jestem świadomy żadnej podobnej operacji kopiowania dla ciągów. Jaki jest idiomatyczny i najszybszy sposób na "skopiowanie" podłańcucha?

+1

Jest to rodzaj Mankamentem Go. Powinno być możliwe użycie make (string, foo [x: y]). – fuz

Odpowiedz

1

Na przykład

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))) 
} 

wyjściowa:

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

Czy to rozwiązanie nie powoduje utworzenia dwóch kopii podciągu? Jeden do konwersji na [] bajt, a drugi do konwersji z powrotem na ciąg? – Beevik

+1

Tak, niestety. Jednak kawałek bajtowy jest tymczasowy. – peterSO

Powiązane problemy