gpt4 book ai didi

java - 在 Go 中是否有等同于 Java 的 String intern 函数?

转载 作者:IT王子 更新时间:2023-10-29 01:00:20 28 4
gpt4 key购买 nike

在 Go 中是否有等同于 Java 的 String intern 函数?

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

最佳答案

据我所知,不存在这样的功能。但是,您可以使用 map 轻松制作自己的 map 。字符串类型本身是一个 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))

关于java - 在 Go 中是否有等同于 Java 的 String intern 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13017499/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com