Go 中的字符串操作,与 Python 或 Ruby 等语言不同,涉及处理指向字符串数据的指针。在提供的代码示例中,我们的目标是创建一个将图像标签映射到图像 URL 列表的数据结构。然而,简单的方法涉及按值复制字符串值,如果数据结构变大,这可能会导致内存效率低下。
最初的解决方案使用指向图像 URL 的指针字符串而不是按值复制它们。但是,这种方法有局限性:
为了实现最佳的内存使用,我们需要考虑Go中的字符串值本质上是指针。存储字符串值会复制 16 字节结构,无论其长度如何。使用字符串池或“interners”允许我们跟踪字符串的出现并重用现有的字符串描述符,而不是创建新的。
我们的解决方案包括一个简单的字符串内部缓存字符串值并在遇到重复项时返回现有描述符。通过“驻留”字符串,我们确保相同字符串值的所有出现都指向单个字符串描述符,从而最大限度地减少内存消耗。
生成的代码如下:
<code class="go">result := searchImages() tagToUrlMap := make(map[string][]string) for _, image := range result { imageURL := interned(image.URL) for _, tag := range image.Tags { tagName := interned(tag.Name) tagToUrlMap[tagName] = append(tagToUrlMap[tagName], imageURL) } } // Clear the interner cache: cache = nil</code>
该解决方案通过使用字符串驻留来最大限度地减少内存使用,而不会引入过多的复杂性。
以上是字符串实习如何优化 Go 数据结构中的内存使用?的详细内容。更多信息请关注PHP中文网其他相关文章!