猿问

Go中有与Java的String intern函数等效的功能吗?

Go中有与Java的String intern函数等效的功能吗?

我正在解析很多具有重复模式(标签)的文本输入。我想提高内存效率,并为每个标签存储指向单个字符串的指针,而不是为每次出现的标签存储多个字符串的指针。


慕标5832272
浏览 160回答 2
2回答

青春有我

我认为例如Pool和GoPool可以满足您的需求。该代码解决了Stephen的解决方案忽略的一件事。在Go中,字符串值可以是更大字符串的一部分。场景是无关紧要的,场景是放映停止的位置。链接的功能试图保持安全。

墨色风雨

我不知道有没有这样的功能。但是,您可以使用地图非常轻松地制作自己的地图。字符串类型本身是一个uintptr和一个长度。因此,从另一个字符串分配的一个字符串仅占用两个单词。因此,您要做的就是确保不存在两个包含冗余内容的字符串。这是我的意思的一个例子。type Interner map[string]stringfunc NewInterner() Interner {    return Interner(make(map[string]string))}func (m Interner) Intern(s string) string {    if ret, ok := m[s]; ok {        return ret    }    m[s] = s    return s}每当您执行以下操作时,此代码都将对冗余字符串进行重复数据删除:str = interner.Intern(str)编辑:正如jnml所提到的,我的答案可能会固定内存,具体取决于它给出的字符串。有两种方法可以解决此问题。m[s] = s在我的上一个示例中,这两个都应插入之前。第一个将字符串复制两次,第二个使用不安全。都不是理想的。双重副本:b := []byte(s)s = string(b)不安全(使用风险自担。与当前版本的gc编译器一起使用):b := []byte(s)s = *(*string)(unsafe.Pointer(&b))
随时随地看视频慕课网APP

相关分类

Go
我要回答