2013-06-04 65 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