Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Golang: map, pointer, address, Go, golang

Можно ли взять указатель на значение, хранящееся в map?

Проверяет понимание адресации элементов в map и особенностей работы с указателями на значения в Go.

Короткий ответ

Нет, нельзя взять указатель на значение, хранящееся в map. Это связано с тем, что map может перераспределять память при добавлении новых элементов, что делает адреса нестабильными. Вместо этого можно скопировать значение в переменную и взять указатель на неё.

Длинный ответ

Почему нельзя взять указатель на значение в map?

В Go map — это хеш-таблица, которая динамически изменяет свой размер при добавлении новых элементов. Когда map перераспределяет память, все существующие значения перемещаются на новые адреса. Если бы вы могли получить указатель на значение, он стал бы недействительным после такого перераспределения, что привело бы к неопределённому поведению.

Как это работает на практике?

Рассмотрим пример:

m := map[string]int{"a": 1}
// Ошибка компиляции:
// p := &m["a"]
// cannot take address of m["a"]

// Правильный подход:
val := m["a"]
p := &val
fmt.Println(*p) // 1

Компилятор Go явно запрещает взятие адреса элемента map на этапе компиляции. Это защита от потенциальных ошибок.

Альтернативные решения

  • Используйте указатели в качестве значений map: m := map[string]*int{}
  • Копируйте значение в локальную переменную и работайте с ней
  • Для изменяемых структур используйте map с указателями на структуры

Пример с указателями в значениях

type User struct {
    Name string
}

users := map[int]*User{
    1: {Name: "Alice"},
}

// Теперь можно изменять поля через указатель
users[1].Name = "Bob"
fmt.Println(users[1].Name) // Bob

В этом случае map хранит указатели, а не сами структуры, поэтому адреса остаются стабильными.

Вывод: Запрет на взятие указателя от значения map — это осознанное решение разработчиков Go для обеспечения безопасности памяти. Используйте map с указателями в качестве значений, если вам нужно изменять элементы по ссылке, или копируйте значения для временного использования.

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • Golang

    Golang

Ключевые слова

#map

#pointer

#address

#Go

#golang

Подпишись на Golang Developer в телеграм

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.