为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕标5832272 2021-05-04 12:32:11
Go中有与Java的String intern函数等效的功能吗?我正在解析很多具有重复模式(标签)的文本输入。我想提高内存效率,并为每个标签存储指向单个字符串的指针,而不是为每次出现的标签存储多个字符串的指针。
查看完整描述

2 回答

?
青春有我

TA贡献1784条经验 获得超8个赞

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


查看完整回答
反对 回复 2021-05-17
?
墨色风雨

TA贡献1853条经验 获得超6个赞

我不知道有没有这样的功能。但是,您可以使用地图非常轻松地制作自己的地图。字符串类型本身是一个uintptr和一个长度。因此,从另一个字符串分配的一个字符串仅占用两个单词。因此,您要做的就是确保不存在两个包含冗余内容的字符串。


这是我的意思的一个例子。


type Interner map[string]string


func 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))


查看完整回答
反对 回复 2021-05-17
  • 2 回答
  • 0 关注
  • 159 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信