String interning — техника, при которой одинаковые строки хранятся в памяти один раз, а все переменные ссылаются на одну и ту же область. Это экономит память, когда в программе много дубликатов строк.
В Go нет встроенного string interning как в Java. Строки в Go иммутабельны, но каждая может иметь свою копию данных. Если ты парсишь CSV с миллионом строк и в колонке "город" 90% значений — "Москва", каждая строка будет отдельным аллоком.
var pool = map[string]string{}
func intern(s string) string {
if existing, ok := pool[s]; ok {
return existing
}
pool[s] = s
return s
}
На практике используют sync.Map или специализированные библиотеки. Ещё один трюк — unique.Handle из Go 1.23, который делает interning из коробки. Это особенно актуально при работе с большими JSON/CSV, логами и протобафами, где повторяющиеся строки жрут гигабайты.