根据这篇 Go数据结构文章,在字符串部分指出,对一个字符串进行切片操作会在内存中保留原始字符串。
"(顺便提一下,在Java和其他语言中有个常见的陷阱,当你切割一个字符串以保存一小部分时,对原始引用的保留会使整个原始字符串仍然存在于内存中,即使只需要很少的一部分。Go也有这个陷阱。我们尝试过并拒绝了另一种选择,即使字符串切片非常昂贵——需要分配和复制——大多数程序都会避免它。)"
因此,如果我们有一个非常长的字符串:
s := "Some very long string..."
我们只提取一小部分:
newS := s[5:9]
在我们发布newS
之前,原始的s
将不会被释放。鉴于此,如果我们需要长期保留newS
,但需要释放s
进行垃圾回收,应该采取什么适当的方法?
我想也许可以尝试以下方法:
newS := string([]byte(s[5:9]))
但我并不确定那样做是否有效,或者有更好的方法。