String interning — переиспользование одной копии строки вместо дубликатов. Go не делает interning автоматически (в отличие от Java).
Строка в Go — это (pointer, length). Каждый string([]byte) создаёт новую копию.
a := "hello" // строковый литерал — компилятор может дедуплицировать
b := string([]byte("hello")) // новая аллокация, другой pointer
fmt.Println(a == b) // true (по значению)
// но это разные участки памяти
Ручной interning через map:
var pool = map[string]string{}
var mu sync.Mutex
func intern(s string) string {
mu.Lock()
defer mu.Unlock()
if interned, ok := pool[s]; ok {
return interned // переиспользуем
}
pool[s] = s
return s
}
С Go 1.23 — unique.Handle:
import "unique"
h := unique.Make("hello") // intern
s := h.Value() // получить строку обратно
Когда нужен: парсинг логов/CSV с миллионами повторяющихся строк (статусы, коды стран), ORM с повторяющимися column names.