Go有沒有和Java的String intern函數等價的東西?Go有沒有和Java的String intern函數等價的東西?
我解析了很多具有重複模式(標籤)的文本輸入。我想對它進行高效的存儲,併爲每個標籤存儲指向單個字符串的指針,而不是每次出現標籤時使用多個字符串。
Go有沒有和Java的String intern函數等價的東西?Go有沒有和Java的String intern函數等價的東西?
我解析了很多具有重複模式(標籤)的文本輸入。我想對它進行高效的存儲,併爲每個標籤存儲指向單個字符串的指針,而不是每次出現標籤時使用多個字符串。
沒有我知道的這樣的函數。但是,您可以非常方便地使用地圖。字符串類型本身是一個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))
我喜歡這個答案的直接性,這基本上是任何正確的答案應該有這個問題的骨架 - 字符串值映射到唯一的字符串實例。我接受了另一個答案,因爲它是一個已經制作好的庫,併成功地解決了字符串是另一個更大字符串切片的問題。 – Malcolm
我喜歡所引用的庫及其解決方案來處理引用內存問題中較大字符串的字符串。 – Malcolm