👣 netip.Addr в Go устроен хитрее, чем кажется. — 2 июня 2026 г. в 23:01:56.062
👣 netip.Addr в Go устроен хитрее, чем кажется. Внутри это почти минимальная структура для IP-адреса: два uint64, где лежат старшие и младшие биты адреса. Такой формат удобен для быстрых операций: вместо побайтовой обработки можно работать с 64-битными регистрами. Но есть нюанс: у IPv6 бывают zones. Например, link-local адрес может быть привязан к конкретному сетевому интерфейсу: fe80::1%eth0 На уровне сети zone может быть числом, но в Go её удобно хранить как строку: eth0, wlan0, en0. Проблема в том, что строка внутри Addr сразу раздула бы структуру и ударила бы по производительности. А netip.Addr должен быть маленьким, дешёвым для копирования и быстрым. Решение - unique.Handle. Go хранит детали адреса отдельно: zone и другие данные попадают в глобальный потокобезопасный кеш. А сам Addr держит не строку, а компактную ссылку на уже сохранённую запись. Получается компромисс: • IP-адрес остаётся лёгким • зоны IPv6 можно хранить как строки • одинаковые значения не дублируются в памяти • структура не превращается в тяжёлый объект Выглядит немного некрасиво, зато очень по-Go: наружу простой API, внутри - аккуратная инженерная экономия на размере, аллокациях и скорости.

