2 回答
TA贡献1784条经验 获得超8个赞
我认为例如Pool和GoPool可以满足您的需求。该代码解决了Stephen的解决方案忽略的一件事。在Go中,字符串值可以是更大字符串的一部分。场景是无关紧要的,场景是放映停止的位置。链接的功能试图保持安全。
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))
- 2 回答
- 0 关注
- 159 浏览
添加回答
举报