tgoop.com/go_interview_lib/582
Create:
Last Update:
Last Update:
💬 Как канонизировать строки для экономии памяти в Go?
Во время выполнения программы на Go одинаковые строки иногда не делят один и тот же базовый блок памяти, хотя могли бы. Процесс объединения их в один общий блок памяти называется канонизацией строк. В Go есть несколько способов реализовать канонизацию строк.
1️⃣ Канонизация строк при их совпадении
if str1 == str2 {
str1 = str2 // освобождаем базовый блок памяти str2
}
Вот пример реализации для канонизации строк в слайсе:
func CanonicalizeStrings(ss []string) {
type S struct {
str string
index int
}
var temp = make([]S, len(ss))
for i := range temp {
temp[i] = S {
str: ss[i],
index: i,
}
}
for i := 0; i < len(temp); {
var k = i+1
for j := k; j < len(temp); j++ {
if temp[j].str == temp[i].str {
temp[j].str = temp[i].str
temp[k], temp[j] = temp[j], temp[k]
k++
}
}
i = k
}
for i := range temp {
ss[temp[i].index] = temp[i].str
}
}
Этот способ более эффективен для случаев, когда необходимо канонизировать все строки в слайсе.
2️⃣ Использование unique.Handle из Go 1.23
В Go 1.23 добавлена возможность использовать
unique.Handle
для удобной канонизации строк.import "unique"
func CanonicalizeString(s string) string {
return unique.Make(s).Value()
}
func CanonicalizeStrings(ss []string) {
for i, s := range ss {
ss[i] = CanonicalizeString(s)
}
}
Этот способ более гибкий. Достаточно применить функцию
CanonicalizeString
ко всем строкам во время выполнения, и тогда все одинаковые строки будут делить одни и те же базовые блоки памяти.Примечание: метод
unique.Make
не всегда подходит для всех ситуаций. Функция unique.Make
выделяет блок памяти для каждой уникальной строки. Если некоторые неравные строки, подлежащие канонизации, уже делят один и тот же блок памяти, unique.Make
выделит новый блок памяти для каждой из строк, что может привести к увеличению использования памяти (вместо экономии).BY Библиотека Go для собеса | вопросы с собеседований
Share with your friend now:
tgoop.com/go_interview_lib/582