根据这篇Go Data Structures文章,在Strings部分下,它指出获取字符串的一部分会将原始字符串保留在内存中。
“(顺便说一句,在 Java 和其他语言中有一个众所周知的陷阱,当您对字符串进行切片以保存一小段时,对原始字符串的引用会将整个原始字符串保留在内存中,即使只有一小部分仍然存在需要。Go 也有这个问题。我们尝试并拒绝的替代方案是让字符串切片变得如此昂贵——分配和复制——大多数程序都避免它。)”
所以如果我们有一个很长的字符串:
s := "Some very long string..."
我们取一小部分:
newS := s[5:9]
在我们也发布之前,原版s
不会发布newS
。考虑到这一点,如果我们需要newS
长期保留,但要释放s
垃圾收集,应该采取什么正确的方法?
我想也许是这样的:
newS := string([]byte(s[5:9]))
但我不确定这是否真的有效,或者是否有更好的方法。