2013-06-04 2 views
6

Go에서 문자열의 하위 문자열을 가져 오는 경우 새 메모리가 할당되지 않습니다. 대신 하위 문자열의 기본 표현에는 원래 문자열의 데이터 포인터의 오프셋 인 데이터 포인터가 포함되어 있습니다.하위 문자열 및 Go 가비지 수집기

큰 문자열이 있고 작은 하위 문자열을 추적하려는 경우 짧은 문자열에 대한 모든 참조를 해제 할 때까지 가비지 수집기가 큰 문자열을 해제 할 수 없음을 의미합니다.

슬라이스도 비슷한 문제가 있지만 copy()를 사용하여 서브 슬라이스 복사본을 만들어 주위를 둘러 볼 수 있습니다. 문자열에 대한 비슷한 복사 작업을 인식하지 못합니다. 하위 문자열의 "사본"을 만드는 관용적이고 빠른 방법은 무엇입니까? 예를 들어

+1

이 이동의 단점의 일종이다. 이것을 위해 make (string, foo [x : y])를 사용할 수 있어야합니다. – fuz

답변

1

,

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

출력 :

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

이 솔루션으로 인해 하위 문자열이 두 부 생성됩니까? 하나는 [] 바이트로 변환하고 다른 하나는 문자열로 다시 변환 하시겠습니까? – Beevik

+1

예, 불행히도. 그러나 바이트 슬라이스는 일시적입니다. – peterSO

관련 문제