當在Go中取一個字符串的子字符串時,不會分配新的內存。相反,子字符串的底層表示包含一個數據指針,它是原始字符串的數據指針的偏移量。子字符串和Go垃圾回收器
這意味着,如果我有一個大的字符串,並希望保留一小串的軌跡,垃圾收集器將無法釋放任何大串的,直到我釋放較短字符串的所有引用。
切片有類似的問題,但你可以通過使用copy()複製子切片來解決它。我不知道任何類似的字符串複製操作。什麼是創建子字符串「複製」的慣用和最快的方法?
當在Go中取一個字符串的子字符串時,不會分配新的內存。相反,子字符串的底層表示包含一個數據指針,它是原始字符串的數據指針的偏移量。子字符串和Go垃圾回收器
這意味着,如果我有一個大的字符串,並希望保留一小串的軌跡,垃圾收集器將無法釋放任何大串的,直到我釋放較短字符串的所有引用。
切片有類似的問題,但你可以通過使用copy()複製子切片來解決它。我不知道任何類似的字符串複製操作。什麼是創建子字符串「複製」的慣用和最快的方法?
例如,
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}
這是一種圍棋的缺點。爲此,應該可以使用make(string,foo [x:y])。 – fuz