GO_INTERVIEW_LIB Telegram 582
💬 Как канонизировать строки для экономии памяти в 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 выделит новый блок памяти для каждой из строк, что может привести к увеличению использования памяти (вместо экономии).
👍11



tgoop.com/go_interview_lib/582
Create:
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

View MORE
Open in Telegram


Telegram News

Date: |

Co-founder of NFT renting protocol Rentable World emiliano.eth shared the group Tuesday morning on Twitter, calling out the "degenerate" community, or crypto obsessives that engage in high-risk trading. Telegram has announced a number of measures aiming to tackle the spread of disinformation through its platform in Brazil. These features are part of an agreement between the platform and the country's authorities ahead of the elections in October. The Standard Channel Add the logo from your device. Adjust the visible area of your image. Congratulations! Now your Telegram channel has a face Click “Save”.! To delete a channel with over 1,000 subscribers, you need to contact user support
from us


Telegram Библиотека Go для собеса | вопросы с собеседований
FROM American