Как работает string interning?

Senior
321 просмотров
AFK Offer AI

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.

Следующий вопрос

Как разделить unit и integration тесты?