Начиная с Go 1.26,
sync.Map официально работает на базе hash trie. Публичный API не изменился, но внутри теперь совсем другая структура.Как это устроено:
* ключ хешируется в 64 бита
* хеш разбивается на группы по 4 бита
* каждый узел trie имеет до 16 потомков
* lookup проходит по дереву максимум 16 уровней
* структура снижает конкуренцию вокруг одного глобального lock
Но
sync.Map всё ещё не универсальная замена обычному map: в тестах статьи он потреблял примерно в 3-5 раз больше памяти.Использовать его имеет смысл, когда значения в основном один раз записываются и много читаются или goroutine работают преимущественно с разными ключами. В остальных случаях
map + Mutex/RWMutex часто проще и лучше.Очень подробный разбор реализации:
https://victoriametrics.com/blog/go-sync-map-hash-trie/
